{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<div align=\"right\" style=\"text-align: right;\"><i>Peter Norvig<br>Jotto: April 2020<br>Wordle: Jan 2022<br>Evil/Anti: Nov 2022</i></div>\n",
    "\n",
    "# Wordle, Evil Wordle, Antiwordle, and Jotto\n",
    "\n",
    "[**Wordle**](https://www.nytimes.com/games/wordle/index.html) is Josh Wardle's [tremendously popular](https://www.nytimes.com/2022/01/03/technology/wordle-word-game-creator.html) word game in which a **guesser** tries to guess a secret **target** word (chosen from a **word list** of allowable words) in as few guesses as possible. Each guess must be one of the words on the list, and the **reply** to each guess consists of 5 bits (actually [trits](https://en.wiktionary.org/wiki/trit#English)) of information, one for each of the 5 word spots:\n",
    "  - *Green* if the guess letter is in the word and in the correct spot.\n",
    "  - *Yellow* if the guess letter is in the word but in the wrong spot.\n",
    "  - *Miss* if the letter is not in the word in any spot.\n",
    "\n",
    "Wordle uses a list of 12,971 allowable guess words, but only 2,309 of them can be target words. (I think the idea is to follow [Postel's law](https://en.wikipedia.org/wiki/Robustness_principle): \"be conservative in what you send, be liberal in what you accept\".) In this notebook, we'll assume we're only dealing with the 2,309 target words. Historically, Wordle is a refinement of **Jotto**, and has in turn inspired variants inclusding **Evil Wordle** and **Antiwordle**, all of which we will cover in this notebook.\n",
    "\n",
    "First off, import some modules and define the basic types `Word`, `Score`, and `Reply`, and the colors that make up the reply:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from typing      import List, Tuple, Dict, Union, Counter, Callable, Iterable\n",
    "from dataclasses import dataclass\n",
    "from statistics  import mean, median, stdev\n",
    "from collections import defaultdict\n",
    "from functools   import lru_cache\n",
    "from pathlib     import Path\n",
    "from math        import log2\n",
    "import random \n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "Word  = str # A word is a string of five different letters\n",
    "Score = int # A score is the number of guesses it took to get the target word\n",
    "Reply = str # A reply is a str of 5 characters from Green, Yellow, Miss; e.g. 'G...Y'\n",
    "\n",
    "Green, Yellow, Miss = 'GY.'\n",
    "Correct = 5 * Green # The reply for the correct guess\n",
    "\n",
    "random.seed('for reproducibility')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now read in the word list:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "! [ -e wordle-small.txt ] || curl -O https://norvig.com/ngrams/wordle-small.txt\n",
    "\n",
    "wordlist = Path('wordle-small.txt').read_text().split()\n",
    "\n",
    "assert len(wordlist) == 2309"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Replies\n",
    "\n",
    "The rules for Wordle replies, outlined above, contain an ambiguity. Let's clear things up.\n",
    "\n",
    "Assume the guess is `'NINNY'` and the target is `'ANNEX'`. A strict reading of the rules would say that the reply should be `'Y.GY.'`–one of the three `'N'`s is in the right spot and thus is green, and the other two should be yellow  because they are  \"in the word but in the wrong spot.\" But the actual (unstated) rules are that Wordle matches the greens first, and then goes left-to-right with the yellows, and only gives you as many non-misses as there are letters in the target to support them. In this example, there are two `'N'`s in the target, so after the one green, there will only be one more yellow `'N'`, and it will be in the leftmost available spot. The actual reply is `'Y.G..'`.\n",
    "\n",
    "In general, how many possible replies are there? There are 3 responses at each of five positions, and  3<sup>5</sup> = 243, but five of those replies are impossible: you can't have four Greens and one Yellow, because if four letters of the guess are in the right place then the fifth must be either in the right place or a miss. \n",
    "\n",
    "Below is the definition of `reply_for` and some tests. Note that `reply_for` is not symmetric; `reply_for(A, B)` is always a permutation of `reply_for(B, A)`, but they are usually not equal. Since the computation of a reply is somewhat complex, we cache the results.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "@lru_cache(None)\n",
    "def reply_for(guess: Word, target: Word) -> Reply: \n",
    "    \"The five-character reply for this guess on this target.\"\n",
    "    # We'll start by having each element of the reply be either Green or Miss ...\n",
    "    reply = [Green if guess[i] == target[i] else Miss for i in range(5)]\n",
    "    # ... then we'll change the elements that should be yellow\n",
    "    counts = Counter(target[i] for i in range(5) if guess[i] != target[i])\n",
    "    for i in range(5):\n",
    "        if reply[i] == Miss and counts[guess[i]] > 0:\n",
    "            counts[guess[i]] -= 1\n",
    "            reply[i] = Yellow\n",
    "    return ''.join(reply)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert reply_for('NINNY', 'ANNEX') == 'Y.G..'; assert  reply_for('ANNEX', 'NINNY') == '.YG..'\n",
    "assert reply_for('HELLO', 'WORLD') == '...GY'; assert  reply_for('WORLD', 'HELLO') == '.Y.G.'\n",
    "assert reply_for('HELLO', 'ABYSS') == '.....'; assert  reply_for('ABYSS', 'HELLO') == '.....'\n",
    "assert reply_for('EPEES', 'GEESE') == 'Y.GYY'; assert  reply_for('GEESE', 'EPEES') == '.YGYY'\n",
    "assert reply_for('WHEEE', 'PEEVE') == '..GYG'; assert  reply_for('PEEVE', 'WHEEE') == '.YG.G'"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Consistent Target Words\n",
    "\n",
    "A key concept in Wordle is the idea of **consistent target words**. If I guess `'NINNY'` and the reply is `'Y.G..'`, then the target word could be `'ANNEX'`, but it could also be `'ANNUL'` or `'CANON'`. We say these three words are **consistent** with the guess/reply pair.  If we next guess `'ENNUI'` and get the reply `'YGG..'`, then `'ANNEX'` is the only consistent target. When there is a single consistent target left, the guesser can always get it on the next guess. In general, given a word list, I can always determine the list of consistent targets from a sequence of guess/reply pairs. Once I know the consistent words, the guess/reply pairs themselves provide no additional useful information.  "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def consistent_targets(targets, guess, reply) -> List[Word]: \n",
    "    \"\"\"All the words in `targets` that give this `reply` to this `guess`.\"\"\"\n",
    "    return [target for target in targets if reply_for(guess, target) == reply]\n",
    "\n",
    "targets = consistent_targets(wordlist, 'NINNY', 'Y.G..')\n",
    "assert  targets == ['ANNEX', 'ANNUL', 'CANON']\n",
    "assert  consistent_targets(targets, 'ENNUI', 'YGG..') == ['ANNEX']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Playing Wordle\n",
    "\n",
    "The function `play` will play a game of Wordle and return the score (the number of guesses). The  arguments are:\n",
    "- `guesser`: a `callable` (e.g., a function) that should return the guess to make. The guesser is passed two arguments: \n",
    "  - The **reply** to the previous guess.\n",
    "  - A list of **consistent target words**.\n",
    "- `wordlist`: The list of allowable words.\n",
    "- `target`: The target word. If none is given, the target word is chosen at random from the wordlist.\n",
    "- `verbose`: Unless false, print a message for each guess.\n",
    "\n",
    "Two corner cases: \n",
    "1. If the guesser improperly guesses a non-word, the reply is `'unknown'`. \n",
    "2. To prevent an infinite loop with a bad guesser, the worst score you can get is the number of words in the wordlist plus 1."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def play(guesser, wordlist=wordlist, target=None, verbose=True) -> Score:\n",
    "    \"\"\"The number of guesses it take for `guesser` to guess the Jotto word,\n",
    "    which is given by `target` or selected from the words in `wordlist`?\"\"\"\n",
    "    target  = target or random.choice(wordlist) # Choose a random target if none was given\n",
    "    targets = wordlist      # The targets that are consistent with all guess/reply pairs\n",
    "    reply   = None          # For the first guess, there is no previous reply\n",
    "    N       = len(wordlist)\n",
    "    for turn in range(1, N + 1):\n",
    "        guess   = guesser(reply, targets)\n",
    "        reply   = reply_for(guess, target) if guess in wordlist else 'unknown'\n",
    "        targets = consistent_targets(targets, guess, reply)\n",
    "        if verbose: \n",
    "            print(f'Guess {turn}: {guess}, Reply: {reply}; Remaining targets: {len(targets)}')\n",
    "        if reply == Correct:  \n",
    "            return turn\n",
    "    return N + 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To play a game, we will need a guesser. Here are two simple ones:\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "def human_guesser(reply, targets) -> Word: \n",
    "    \"\"\"Ask a human to make a guess.\"\"\"\n",
    "    return input(f'Reply was {reply}. Your guess? ')\n",
    "\n",
    "def random_guesser(reply, targets) -> Word: \n",
    "    \"\"\"Choose a guess at random from the consistent targets.\"\"\"\n",
    "    return random.choice(targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sample Wordle Games\n",
    "\n",
    "Here is the `random_guesser` in action:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: VALUE, Reply: .....; Remaining targets: 313\n",
      "Guess 2: NOTCH, Reply: .Y...; Remaining targets: 21\n",
      "Guess 3: PROXY, Reply: YGG..; Remaining targets: 1\n",
      "Guess 4: DROOP, Reply: GGGGG; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "play(random_guesser)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: SLAIN, Reply: ....G; Remaining targets: 25\n",
      "Guess 2: TOKEN, Reply: ....G; Remaining targets: 1\n",
      "Guess 3: CHURN, Reply: GGGGG; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "play(random_guesser)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: SMOKE, Reply: ..Y.Y; Remaining targets: 64\n",
      "Guess 2: VOWEL, Reply: .Y.YY; Remaining targets: 3\n",
      "Guess 3: FELON, Reply: .GGY.; Remaining targets: 2\n",
      "Guess 4: CELLO, Reply: .GGGG; Remaining targets: 1\n",
      "Guess 5: HELLO, Reply: GGGGG; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "5"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "play(random_guesser, target='HELLO')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Partitioning Target Words\n",
    "\n",
    "We can think of a guess as **partitioning** the consistent targets into different **branches** of a tree, each branch corresponding to a different reply:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "Partition = Dict[Reply, List[str]]\n",
    "\n",
    "def partition(guess, targets) ->  Partition:\n",
    "    \"\"\"A guess partition targets by the possible replies to guess: {reply: [word, ...]}.\"\"\"\n",
    "    branches = defaultdict(list)\n",
    "    for target in targets:\n",
    "        branches[reply_for(guess, target)].append(target)\n",
    "    return branches"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A partition for the full wordlist would be too big to look at, so let's pick out a few words (every 100th one, so that's 24 words), and partition them by two different guesses. First, the few words partitioned by `'ROAST'`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(list,\n",
       "            {'..G..': ['ABACK', 'QUACK'],\n",
       "             'YYY..': ['ARBOR'],\n",
       "             'Y...Y': ['BIRTH', 'TREND'],\n",
       "             '.....': ['BULLY', 'CUMIN'],\n",
       "             '..GG.': ['CLASP', 'PHASE'],\n",
       "             'YY...': ['DROOL', 'HUMOR'],\n",
       "             '..Y..': ['FANCY', 'NINJA'],\n",
       "             'Y.G..': ['FRANK'],\n",
       "             'Y.G.Y': ['GRATE'],\n",
       "             'Y.Y.Y': ['LATER'],\n",
       "             '.YYY.': ['MASON'],\n",
       "             'GGGGG': ['ROAST'],\n",
       "             '..GY.': ['SHALE'],\n",
       "             '...Y.': ['SMELL'],\n",
       "             '..GYY': ['STAMP'],\n",
       "             '..Y.Y': ['TAKEN'],\n",
       "             'Y.Y..': ['VIRAL'],\n",
       "             '..Y.G': ['YACHT']})"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "few = wordlist[::100]\n",
    "\n",
    "partition('ROAST', few)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "No matter what the reply to `'ROAST'` is,  we will be left with no more than 2 remaining possible targets, so we will always be able to win in no more than 3 total guesses. Now, partition by  `'NINJA'`:\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(list,\n",
       "            {'....Y': ['ABACK',\n",
       "              'ARBOR',\n",
       "              'CLASP',\n",
       "              'GRATE',\n",
       "              'LATER',\n",
       "              'PHASE',\n",
       "              'QUACK',\n",
       "              'ROAST',\n",
       "              'SHALE',\n",
       "              'STAMP',\n",
       "              'YACHT'],\n",
       "             '.G...': ['BIRTH'],\n",
       "             '.....': ['BULLY', 'DROOL', 'HUMOR', 'SMELL'],\n",
       "             'YY...': ['CUMIN'],\n",
       "             '..G.Y': ['FANCY'],\n",
       "             'Y...Y': ['FRANK', 'MASON', 'TAKEN'],\n",
       "             'GGGGG': ['NINJA'],\n",
       "             'Y....': ['TREND'],\n",
       "             '.G..Y': ['VIRAL']})"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "partition('NINJA', few)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Almost half the time we get a reply of `'....Y'`, and there are 11 possible target words remaining. That  suggests that `'ROAST'` is a better guess and that a good strategy is: **guess a word that partitions the possible remaining targets into small branches.**\n",
    "\n",
    "To do this we only need to know the *size* of each branch, not the list of words therein, so we could use `partition_counts`:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "def partition_counts(guess, targets) -> List[int]: \n",
    "    \"The sizes of the branches of a partition of targets by guess.\"\n",
    "    counter = Counter(reply_for(guess, target) for target in targets)\n",
    "    return sorted(counter.values())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert partition_counts('ROAST', few) == [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2]\n",
    "assert partition_counts('NINJA', few) == [1, 1, 1, 1, 1, 1, 3, 4, 11]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Metrics for Minimizing Partitions\n",
    "\n",
    "We want partitions with **small branches**, but what exactly does that mean? An ideal goal would be to minimize the average number of additional guesses it will take to finish the game, and to eliminate the possibility of losing the game (needing more than 6 guesses). However, just looking at a single partition (without looking ahead further) can't tell us that, so instead we can minimize one of the following proxy metrics:\n",
    "\n",
    "- **Maximum**: choose the partition that minimizes the size of the largest branch.\n",
    "\n",
    "- **Expectation**: In probability theory, the expectation (also known as expected value) is the weighted average of a random variable. Here it means the sum, over all branches, of the probability of ending up in the branch multiplied by the size of the branch. We are assuming that every target is equally likely, so the probability of a branch is proportional to the number of targets in it.\n",
    "\n",
    "- **Negative Entropy**: In information theory, entropy is the weighted average amount of \"information\" measured in bits. The calculation is the same as expectation except that we count the base 2 logarithm of the branch sizes, not the branches sizes themselves. You can think of the base 2 logarithm as the number of times that you need to cut a branch in half to get it down to one word. We want to maximize entropy, or minimize *negative* entropy.\n",
    "\n",
    "The maximum is just the builtin `max` function; here are the other two metrics:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def expectation(counts: List[int]) -> float:\n",
    "    \"The expected value of the counts.\"\n",
    "    N = sum(counts)\n",
    "    def P(x): return x / N\n",
    "    return sum(P(x) * x for x in counts)\n",
    "\n",
    "def neg_entropy(counts: List[int]) -> float: \n",
    "    \"\"\"The negation of the entropy of the counts.\"\"\"\n",
    "    N = sum(counts)\n",
    "    def P(x): return x / N\n",
    "    return sum(P(x) * log2(P(x)) for x in counts)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Caching Best Guesses: Guess Trees\n",
    "\n",
    "Going through every word in the wordlist to decide which one makes the best partition takes some time. I would prefer to do that computation just once and cache it, rather than have to repeat the computation in every new game. I will cache the best guesses in a structure called a **guess tree**: a tree that has branches for every possible path the game might take, with the best guess for each situation precomputed. Some people call this a **policy**: a guideline that tells you what to do in any situation. A guess tree is either:\n",
    "- An **interior node**, which has a guess and a dict of branches, `Node(guess, {reply: subtree, ...})`, where  each subtree covers all the target words that are consistent with the corresponding reply.\n",
    "- A **leaf word**,  indicating the sole remaining consistent target word. Every word in the word list appears as a leaf in exactly one place in the tree."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "@dataclass \n",
    "class Node:\n",
    "    \"\"\"A node in a guess tree stores the best guess, the number of targets covered, and a branch for every reply.\"\"\"\n",
    "    guess: Word\n",
    "    size: int\n",
    "    branches: Dict[Reply, 'Tree']\n",
    "\n",
    "Tree = Union[Node, Word] # A Tree is either an interior Node or a leaf Word"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The function `minimizing_tree(metric, targets)` builds a guess tree that covers all the targets and that, at every node, guesses a word that  minimizes the `metric` applied to the `partition_counts` of the guess."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def minimizing_tree(metric, targets) -> Tree:\n",
    "    \"\"\"Make a tree that picks guesses that minimize metric(partition_counts(guess, targets)).\"\"\"\n",
    "    if len(targets) == 1:\n",
    "        return targets[0]\n",
    "    else:\n",
    "        guess = min(targets, key=lambda guess: metric(partition_counts(guess, targets))) \n",
    "        branches = partition(guess, targets)\n",
    "        return Node(guess, len(targets), \n",
    "                    {reply: minimizing_tree(metric, branches[reply]) \n",
    "                     for reply in branches})"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here is a minimizing tree that covers the 24 `few` words. The tree says that the first guess, `\"ROAST\"`, covers 24 target words, and for 12 replies there is only one word left, but for the first 6 replies a second guess is required (e.g., if the reply is `'..G..` then the second guess is `\"ABACK\"`). Either that second guess will be right, or we will need a third guess (in this example, `'QUACK'`)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert (minimizing_tree(max, few) == \n",
    "    Node(\"ROAST\", 24,\n",
    "         {'..G..': Node(\"ABACK\", 2, {'GGGGG': 'ABACK', '..GGG': 'QUACK'}), \n",
    "          'Y...Y': Node(\"BIRTH\", 2, {'GGGGG': 'BIRTH', '..YY.': 'TREND'}), \n",
    "          '.....': Node(\"BULLY\", 2, {'GGGGG': 'BULLY', '.G...': 'CUMIN'}), \n",
    "          '..GG.': Node(\"CLASP\", 2, {'GGGGG': 'CLASP', '..GGY': 'PHASE'}), \n",
    "          'YY...': Node(\"DROOL\", 2, {'GGGGG': 'DROOL', '.Y.G.': 'HUMOR'}), \n",
    "          '..Y..': Node(\"FANCY\", 2, {'GGGGG': 'FANCY', '.YG..': 'NINJA'}), \n",
    "          'YYY..': 'ARBOR', \n",
    "          'Y.G..': 'FRANK', \n",
    "          'Y.G.Y': 'GRATE', \n",
    "          'Y.Y.Y': 'LATER', \n",
    "          '.YYY.': 'MASON', \n",
    "          'GGGGG': 'ROAST', \n",
    "          '..GY.': 'SHALE', \n",
    "          '...Y.': 'SMELL', \n",
    "          '..GYY': 'STAMP', \n",
    "          '..Y.Y': 'TAKEN', \n",
    "          'Y.Y..': 'VIRAL', \n",
    "          '..Y.G': 'YACHT'}))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Turning a Tree into a Guesser\n",
    "\n",
    "A tree is not a guesser, but we can easily make a guesser from a tree. A `TreeGuesser` works as follows:\n",
    "- When *initialized*, it takes a tree as input, and stores the tree under the `.root` attribute.\n",
    "- When *called*, it first sets the `.tree` attribute as follows:\n",
    "  - For the first turn in a game (when the reply is `None`), it resets `.tree`  to `.root`.\n",
    "  - On subsequent turns, it updates `.tree` to be the branch corresponding to the reply.\n",
    "  - After setting `.tree`, it returns the guess for the current tree: either the `.guess` attribute  or the leaf word. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "class TreeGuesser:\n",
    "    \"\"\"Given a guess tree, use it to create a callable Guesser that can play Wordle.\"\"\"\n",
    "    def __init__(self, tree): self.root = tree\n",
    "        \n",
    "    def __call__(self, reply, targets) -> Word:\n",
    "        \"\"\"If reply is `None`, start a new game; otherwise follow the branch for the `reply`.\n",
    "        Then return the current leaf or interior node guess. (Ignore `targets`.)\"\"\"\n",
    "        self.tree = self.root if reply is None else self.tree.branches[reply]\n",
    "        return self.tree.guess if isinstance(self.tree, Node) else self.tree"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we build a tree that minimizes the maximum branch size (over the full wordlist) and make a guesser out of it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 23 s, sys: 284 ms, total: 23.3 s\n",
      "Wall time: 23.3 s\n"
     ]
    }
   ],
   "source": [
    "%time guesser = TreeGuesser(minimizing_tree(max, wordlist))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sample Games with the Minimizing Guesser\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: ARISE, Reply: ..Y..; Remaining targets: 107\n",
      "Guess 2: UNTIL, Reply: ..GY.; Remaining targets: 10\n",
      "Guess 3: DITCH, Reply: .GG.Y; Remaining targets: 1\n",
      "Guess 4: PITHY, Reply: GGGGG; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "play(guesser)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: ARISE, Reply: ....Y; Remaining targets: 120\n",
      "Guess 2: TOWEL, Reply: .GYG.; Remaining targets: 3\n",
      "Guess 3: WOKEN, Reply: GGGGG; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "play(guesser)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: ARISE, Reply: ....Y; Remaining targets: 120\n",
      "Guess 2: TOWEL, Reply: .Y.YY; Remaining targets: 5\n",
      "Guess 3: CELLO, Reply: .GGGG; Remaining targets: 1\n",
      "Guess 4: HELLO, Reply: GGGGG; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "4"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "play(guesser, target='HELLO')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#  Inconsistent Guesses and \"Hard Mode\"\n",
    "\n",
    "So far,  we have always guessed a **consistent** word. That seems reasonable; why waste a guess on a word that could not possibly be the target? But it turns out that in some cases it ***is*** a good strategy to guess such a word.\n",
    "\n",
    "Suppose the entire word list consisted of these nine words:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "ails = ['BAILS', 'FAILS', 'HAILS', 'NAILS', 'PAILS', 'RAILS', 'SAILS', 'TAILS', 'WAILS']"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "If we guessed any one of the nine words, there would be a 1/9 chance of being correct, and a 8/9 chance of getting the reply `'.GGGG'`, which adds no new information, and leaves us with 8 similar words to choose from. Overall, we'd expect to take 5 guesses on average, with 9 in the worst case. Not a good performance. \n",
    "\n",
    "On the other hand, we could make an inconsistent guess. This sacrifices the 1/9 chance of being correct on the first guess, but gives us more new information for subsequent guesses. For example, `'BERTH'` is a good first guess:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(list,\n",
       "            {'G....': ['BAILS'],\n",
       "             '.....': ['FAILS', 'NAILS', 'PAILS', 'SAILS', 'WAILS'],\n",
       "             '....Y': ['HAILS'],\n",
       "             '..Y..': ['RAILS'],\n",
       "             '...Y.': ['TAILS']})"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "partition('BERTH', ails)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After `'BERTH'`, we have a 4/9 chance of being correct on the second guess, and a 5/9 chance of having just 5 remaining words. The 5 can be handled with another inconsistent guess:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(list,\n",
       "            {'Y.Y..': ['FAILS'],\n",
       "             'Y.Y.Y': ['NAILS'],\n",
       "             'YYY..': ['PAILS'],\n",
       "             'G.Y..': ['SAILS'],\n",
       "             'Y.YY.': ['WAILS']})"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "partition('SPAWN', ['FAILS', 'NAILS', 'PAILS', 'SAILS', 'WAILS'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Wordle has an option to play in **hard mode**, where only consistent guesses are allowed. Why is that called \"hard mode\"? One reason is that it can be a little bit hard for a human without access to a computer to verify that a guess is consistent. But more importantly, it is hard to win the game in hard mode if you get stuck in a situation like the `ails` list, where there are many targets remaining, but you are forced to make guesses that give no new information.\n",
    "\n",
    "To allow for inconsistent guesses, I will redefine `minimizing_tree` so that it is passed both the list of remaining consistent target words and the complete word list. It also takes a flag, `inconsistent`. When this flag is true, any word in the wordlist can be considered as a guess; when false, only consistent targets are considered, as before. (Note: when there are 3 or fewer target words left there is no use considering inconsistent guesses, since they cannot improve the average score over a consistent guess. Also, when there are many targets, the odds are one of them will be as good as any inconsistent guess. The value of *many* was empirically chosen as `inconsistent_max = 125`.)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [],
   "source": [
    "def minimizing_tree(metric, targets, wordlist=wordlist, inconsistent=False) -> Tree:\n",
    "    \"\"\"Make a tree that picks guesses that minimize metric(partition_counts(guess, targets)).\"\"\"\n",
    "    if len(targets) == 1:\n",
    "        return targets[0]\n",
    "    else:\n",
    "        guesses  = wordlist if (inconsistent and (3 < len(targets) <= inconsistent_max)) else targets\n",
    "        guess    = min(guesses, key=lambda guess: metric(partition_counts(guess, targets))) \n",
    "        branches = partition(guess, targets)\n",
    "        return Node(guess, len(targets), \n",
    "                    {reply: minimizing_tree(metric, branches[reply], wordlist, inconsistent) \n",
    "                     for reply in branches})\n",
    "    \n",
    "inconsistent_max = 125"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [],
   "source": [
    "assert (minimizing_tree(max, ails, inconsistent=True) == \n",
    "        Node(\"BERTH\", 9,\n",
    "             {'.....': Node(\"SPAWN\", 5,\n",
    "                            {'G.Y..': 'SAILS', \n",
    "                             'Y.Y..': 'FAILS', \n",
    "                             'Y.Y.Y': 'NAILS', \n",
    "                             'Y.YY.': 'WAILS', \n",
    "                             'YYY..': 'PAILS'}), \n",
    "              '....Y': 'HAILS', \n",
    "              '...Y.': 'TAILS', \n",
    "              '..Y..': 'RAILS', \n",
    "              'G....': 'BAILS'}))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Evaluating and Reporting on Guessers\n",
    "\n",
    "I'll introduce three functions that together will evaluate a guesser and produce a report:\n",
    "\n",
    "- `report_minimizing_tree` builds a minimizing tree, gets its tree scores, and calls `report`.\n",
    "- `report` takes a list of scores and reports the following statistics:\n",
    "  - The median, mean, standard deviation, and worst case number of guesses, and total number of scores.\n",
    "  - The cumulative percentages guessed correctly (e.g., `\"≤5:11%\"` means 11% of the targets took 5 or fewer guesses).\n",
    "  - A histogram of scores.\n",
    "- `tree_scores` takes a guesser and returns a list of *all* the scores it would make for *all* its targets. For each subtree branch in the tree there are three cases:\n",
    "  - If the subtree is a leaf word that is the same as the node's guess, we're done; it took one guess.\n",
    "  - If the subtree is a leaf word that is not the guess, it took two guesses: one for the incorrect guess and one for the leaf word.\n",
    "  - If the subtree is a Node, add one to each of the scores from the subtree and yield those scores."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "def report_minimizing_tree(metric, targets=wordlist, wordlist=wordlist, inconsistent=False):\n",
    "    \"\"\"Build a minimizing tree and report on its scores.\"\"\"\n",
    "    print(f\"minimizing the {metric.__name__} of partition sizes over {len(targets):,d}\",\n",
    "          f\"targets; inconsistent guesses\", (\"allowed\" if inconsistent else \"prohibited\"))\n",
    "    tree = minimizing_tree(metric, targets, wordlist, inconsistent)\n",
    "    print(f'first guess: \"{tree.guess}\"')\n",
    "    report(tree_scores(tree))\n",
    "\n",
    "def report(scores: Iterable[Score]) -> None:\n",
    "    \"\"\"Report statistics and a histogram for these scores.\"\"\"\n",
    "    scores  = list(scores)\n",
    "    ctr     = Counter(scores)\n",
    "    bins    = range(1, histogram_bins + 2)\n",
    "    scale   = 100 / len(scores)\n",
    "    weights = [scale * ctr[score] for score in ctr]\n",
    "    plt.hist(list(ctr), weights=weights, align='left', rwidth=0.9, bins=bins)\n",
    "    plt.xticks(bins[:-1])\n",
    "    plt.xlabel('Number of guesses'); plt.ylabel('% of scores')\n",
    "    def cumulative_pct(g) -> str: \n",
    "        \"\"\"What percent of games requires no more than g guesses?\"\"\"\n",
    "        percent = scale * sum(ctr[i] for i in range(1, g + 1))\n",
    "        return f'≤{g}:{percent:.{1 if 99 < percent < 100 else 0}f}%'\n",
    "    print(f'median: {median(scores):.0f} guesses, mean: {mean(scores):.2f}',\n",
    "          f'± {stdev(scores):.2f}, worst: {max(scores)}, best: {min(scores)}\\n'\n",
    "          'cumulative:', ', '.join(map(cumulative_pct, range(2, 11))))\n",
    "    \n",
    "def tree_scores(node: Node) -> Iterable[Score]:\n",
    "    \"\"\"All the scores for playing all the target words in the tree under `node`.\"\"\"\n",
    "    for subtree in node.branches.values():\n",
    "        if isinstance(subtree, Word):\n",
    "            yield 1 if subtree == node.guess else 2\n",
    "        else:\n",
    "            yield from (score + 1 for score in tree_scores(subtree))\n",
    "            \n",
    "histogram_bins = 10 # The number of bins in the histogram created by `report` "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here are two reports for the 9-word `ails` list, with consistent guesses prohibited and allowed:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the max of partition sizes over 9 targets; inconsistent guesses prohibited\n",
      "first guess: \"BAILS\"\n",
      "median: 5 guesses, mean: 5.00 ± 2.74, worst: 9, best: 1\n",
      "cumulative: ≤2:22%, ≤3:33%, ≤4:44%, ≤5:56%, ≤6:67%, ≤7:78%, ≤8:89%, ≤9:100%, ≤10:100%\n"
     ]
    },
    {
     "data": {
      "image/png": "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unhdZho3blwROQAAAK6L12VGko4dO6YFCxbo4MGDcjgcCg8PV1xcnJo3b17e+QAAAErk9dVM69evV+vWrZWSkqJ27dqpTZs22rVrlyIiIpScnFwRGQEAAIrl9czMlClT9Nxzz2nOnDlFxidPnqzevXuXWzgAAIDSeD0zc/DgQT355JNFxmNiYvTNN9+USygAAICy8rrM3Hbbbdf81ez09HTuBgwAAG44rw8zjR49Wk8//bSOHz+uqKgoORwObdu2TXPnztXEiRMrIiMAAECxvC4zL730kgICAvTqq69q6tSpkqSQkBDNmDHD40Z6AAAAN4LXh5kcDoeee+45nTx5Urm5ucrNzdXJkycVFxcnh8NR7gG/++47PfbYYwoKClL16tXVvn17paWllfvrAAAAM13XHYALCgoUFhamgIAA9/iRI0dUpUoVNWnSpNzCnTt3TtHR0brnnnu0du1a1a1bV8eOHVPt2rXL7TUAAIDZvC4zI0eOVExMjMLCwjzGd+3apXfffVebNm0qr2yaO3euQkNDtWTJEvdYeZYlAABgPq8PM+3du1fR0dFFxu++++5rXuX0e6xZs0adOnXSww8/rLp166pDhw565513StwmPz9feXl5HgsAALh5Xdc5MxcuXCgynpubW+6/mH38+HEtWrRIYWFhWr9+vZ555hmNHz9e77//frHbJCYmKjAw0L2EhoaWayYAAOBbvC4z3bp1U2JiokdxKSwsVGJiorp27Vqu4Vwul+644w4lJCSoQ4cOGjNmjEaPHq1FixYVu83UqVPdJybn5uYqOzu7XDMBAADf4vU5M/PmzVP37t3VsmVLdevWTZK0detW5eXlaePGjeUaLjg4WK1bt/YYCw8P16pVq4rdxul0yul0lmsOAADgu7yemWndurX279+vIUOGKCcnRxcuXNATTzyhQ4cOqU2bNuUaLjo6WpmZmR5jhw8fVuPGjcv1dQAAgLm8npmRfr1JXkJCQnlnKeK5555TVFSUEhISNGTIEKWkpGjx4sVavHhxhb82AAAwg9czM+vWrdO2bdvc6wsXLlT79u01bNgwnTt3rlzDde7cWatXr9aKFSvUpk0bzZo1SwsWLNDw4cPL9XUAAIC5vC4zkyZNcl/unJGRofj4ePXv31/Hjx9XfHx8uQd84IEHlJGRocuXL+vgwYMaPXp0ub8GAAAw13XdAfjq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mJgYj7HBgwdbjz32mE2JyubSpUuWn5+f9dlnn3mMR0ZGWtOmTbMpVcl++73icrms+vXrW3PmzHGPXb582QoMDLTeeustGxL+fszMoFzk5uZKkurUqWNzkrIrLCzURx99pIsXL6pLly52xylVbGysBgwYoF69etkdpcyOHDmikJAQNW3aVI888oiOHz9ud6QSrVmzRp06ddLDDz+sunXrqkOHDnrnnXfsjuWVK1eu6MMPP1RMTIxP/7hu165d9eWXX+rw4cOSpH379mnbtm3q37+/zclKVlBQoMLCQlWrVs1j3N/fX9u2bbMplXeysrJ0+vRp9enTxz3mdDrVo0cP7dixw8Zk18/n7wAM32dZluLj49W1a1e1adPG7jilysjIUJcuXXT58mXVrFlTq1evVuvWre2OVaKPPvpIe/bs8bnj8iW566679P7776tFixb64Ycf9MorrygqKkoHDhxQUFCQ3fGu6fjx41q0aJHi4+P14osvKiUlRePHj5fT6dQTTzxhd7wy+eSTT3T+/HmNHDnS7iglmjx5snJzc9WqVSv5+fmpsLBQs2fP1qOPPmp3tBIFBASoS5cumjVrlsLDw1WvXj2tWLFCu3btUlhYmN3xyuTqjzf/9geb69WrpxMnTtgR6XejzOB3GzdunPbv32/Mv0patmyp9PR0nT9/XqtWrdKIESO0efNmny002dnZiouL04YNG4r8a9CX9evXz/3fbdu2VZcuXdS8eXMtW7ZM8fHxNiYrnsvlUqdOnZSQkCBJ6tChgw4cOKBFixYZU2bee+899evXTyEhIXZHKdHKlSv14Ycfavny5YqIiFB6eromTJigkJAQjRgxwu54Jfrggw8UExOjBg0ayM/PT3fccYeGDRumPXv22B3NK7+dubMsy6dn80pCmcHv8uyzz2rNmjXasmWLGjZsaHecMqlatapuv/12SVKnTp2Umpqq119/XW+//bbNya4tLS1NOTk56tixo3ussLBQW7ZsUVJSkvLz8+Xn52djwrKpUaOG2rZtqyNHjtgdpVjBwcFFSm14eLhWrVplUyLvnDhxQl988YU+/vhju6OUatKkSZoyZYoeeeQRSb8W3hMnTigxMdHny0zz5s21efNmXbx4UXl5eQoODtbQoUPVtGlTu6OVydWrCk+fPq3g4GD3eE5OTpHZGlNwzgyui2VZGjdunD7++GNt3LjRmD/E12JZlvLz8+2OUaz77rtPGRkZSk9Pdy+dOnXS8OHDlZ6ebkSRkaT8/HwdPHjQ4y9PXxMdHV3kFgOHDx825odtlyxZorp162rAgAF2RynVpUuXVKmS51eQn5+fEZdmX1WjRg0FBwfr3LlzWr9+vQYNGmR3pDJp2rSp6tev777qTfr1XKvNmzcrKirKxmTXj5kZH/DTTz/p6NGj7vWsrCylp6erTp06atSokY3JihcbG6vly5fr008/VUBAgPsYbGBgoPz9/W1OV7wXX3xR/fr1U2hoqC5cuKCPPvpImzZt0rp16+yOVqyAgIAi5yLVqFFDQUFBPn2O0vPPP6+BAweqUaNGysnJ0SuvvKK8vDyf/lf3c889p6ioKCUkJGjIkCFKSUnR4sWLtXjxYrujlcrlcmnJkiUaMWKEKlf2/b/aBw4cqNmzZ6tRo0aKiIjQ3r17NX/+fMXExNgdrVTr16+XZVlq2bKljh49qkmTJqlly5YaNWqU3dHcSvtemTBhghISEhQWFqawsDAlJCSoevXqGjZsmI2pfwdbr6WCZVmW9dVXX1mSiiwjRoywO1qxrpVXkrVkyRK7o5UoJibGaty4sVW1alXrtttus+677z5rw4YNdsfymgmXZg8dOtQKDg62qlSpYoWEhFiDBw+2Dhw4YHesUv3zn/+02rRpYzmdTqtVq1bW4sWL7Y5UJuvXr7ckWZmZmXZHKZO8vDwrLi7OatSokVWtWjWrWbNm1rRp06z8/Hy7o5Vq5cqVVrNmzayqVata9evXt2JjY63z58/bHctDad8rLpfLmj59ulW/fn3L6XRa3bt3tzIyMuwN/Ts4LMuybniDAgAAKCecMwMAAIxGmQEAAEajzAAAAKNRZgAAgNEoMwAAwGiUGQAAYDTKDAAAMBplBgAAGI0yA+C6fPvtt3I4HEpPT7c7ituhQ4d09913q1q1amrfvr3dcQDcIJQZwFAjR46Uw+HQnDlzPMY/+eQTORwOm1LZa/r06apRo4YyMzP15Zdf2h0HwA1CmQEMVq1aNc2dO1fnzp2zO0q5uXLlynVve+zYMXXt2lWNGzdWUFBQOaYC4MsoM4DBevXqpfr16ysxMbHY58yYMaPIIZcFCxaoSZMm7vWRI0fqoYceUkJCgurVq6fatWvr5ZdfVkFBgSZNmqQ6deqoYcOG+tvf/lZk/4cOHVJUVJSqVaumiIgIbdq0yePxb775Rv3791fNmjVVr149Pf744/rxxx/dj/fs2VPjxo1TfHy8br31VvXu3fua78PlcmnmzJlq2LChnE6n2rdv7/Fr5w6HQ2lpaZo5c6YcDodmzJhxzf1cuHBBw4cPV40aNRQcHKzXXntNPXv21IQJEzz29cknn3hsV7t2bS1dutS9/t1332no0KG65ZZbFBQUpEGDBunbb791P75p0ybdeeedqlGjhmrXrq3o6GidOHFCkrRv3z7dc889CggIUK1atdSxY0ft3r3bve2OHTvUvXt3+fv7KzQ0VOPHj9fFixfdj7/55psKCwtTtWrVVK9ePf3nf/7nNd8r8EdBmQEM5ufnp4SEBL3xxhs6efLk79rXxo0b9f3332vLli2aP3++ZsyYoQceeEC33HKLdu3apWeeeUbPPPOMsrOzPbabNGmSJk6cqL179yoqKkoPPvigzpw5I0k6deqUevToofbt22v37t1at26dfvjhBw0ZMsRjH8uWLVPlypW1fft2vf3229fM9/rrr+vVV1/VX//6V+3fv199+/bVgw8+qCNHjrhfKyIiQhMnTtSpU6f0/PPPX3M/8fHx2r59u9asWaPk5GRt3bpVe/bs8eqzunTpku655x7VrFlTW7Zs0bZt21SzZk3df//9unLligoKCvTQQw+pR48e2r9/v3bu3Kmnn37affhv+PDhatiwoVJTU5WWlqYpU6aoSpUqkqSMjAz17dtXgwcP1v79+7Vy5Upt27ZN48aNkyTt3r1b48eP18yZM5WZmal169ape/fuXuUHbjp2/2w3gOszYsQIa9CgQZZlWdbdd99txcTEWJZlWatXr7b+/Y/29OnTrcjISI9tX3vtNatx48Ye+2rcuLFVWFjoHmvZsqXVrVs393pBQYFVo0YNa8WKFZZlWVZWVpYlyZozZ477Ob/88ovVsGFDa+7cuZZlWdZLL71k9enTx+O1s7OzLUlWZmamZVmW1aNHD6t9+/alvt+QkBBr9uzZHmOdO3e2xo4d616PjIy0pk+fXuw+8vLyrCpVqlj/+Mc/3GPnz5+3qlevbsXFxbnHJFmrV6/22DYwMNBasmSJZVmW9d5771ktW7a0XC6X+/H8/HzL39/fWr9+vXXmzBlLkrVp06Zr5ggICLCWLl16zccef/xx6+mnn/YY27p1q1WpUiXr559/tlatWmXVqlXLysvLK/Z9An80zMwAN4G5c+dq2bJl+uabb657HxEREapU6f/9lVCvXj21bdvWve7n56egoCDl5OR4bNelSxf3f1euXFmdOnXSwYMHJUlpaWn66quvVLNmTffSqlUrSb+e33JVp06dSsyWl5en77//XtHR0R7j0dHR7tcqi+PHj+uXX37RnXfe6R4LDAxUy5Yty7wP6df3dfToUQUEBLjfV506dXT58mUdO3ZMderU0ciRI9W3b18NHDhQr7/+uk6dOuXePj4+Xk899ZR69eqlOXPmeHwWaWlpWrp0qcdn1rdvX7lcLmVlZal3795q3LixmjVrpscff1x///vfdenSJa/yAzcbygxwE+jevbv69u2rF198schjlSpVkmVZHmO//PJLkeddPcxxlcPhuOaYy+UqNc/Vwykul0sDBw5Uenq6x3LkyBGPQyM1atQodZ//vt+rLMvy6sqtq5/Dtfbz29cp6TNzuVzq2LFjkfd1+PBhDRs2TJK0ZMkS7dy5U1FRUVq5cqVatGihr7/+WtKv5zEdOHBAAwYM0MaNG9W6dWutXr3ave8xY8Z47Hffvn06cuSImjdvroCAAO3Zs0crVqxQcHCw/vKXvygyMlLnz58v8+cA3GwoM8BNYs6cOfrnP/+pHTt2eIzfdtttOn36tMeXc3neG+bqF7QkFRQUKC0tzT37cscdd+jAgQNq0qSJbr/9do+lrAVGkmrVqqWQkBBt27bNY3zHjh0KDw8v836aN2+uKlWqKCUlxT2Wl5fnPu/mqttuu81jJuXIkSMesx933HGHjhw5orp16xZ5X4GBge7ndejQQVOnTtWOHTvUpk0bLV++3P1YixYt9Nxzz2nDhg0aPHiwlixZ4t73gQMHiuz39ttvV9WqVSX9OgPWq1cvzZs3T/v379e3336rjRs3lvlzAG42lBngJtG2bVsNHz5cb7zxhsd4z5499X//93+aN2+ejh07poULF2rt2rXl9roLFy7U6tWrdejQIcXGxurcuXOKiYmRJMXGxurs2bN69NFHlZKSouPHj2vDhg2KiYlRYWGhV68zadIkzZ07VytXrlRmZqamTJmi9PR0xcXFlXkfAQEBGjFihCZNmqSvvvpKBw4cUExMjCpVquQxW3PvvfcqKSlJe/bs0e7du/XMM894zFINHz5ct956qwYNGqStW7cqKytLmzdvVlxcnE6ePKmsrCxNnTpVO3fu1IkTJ7RhwwYdPnxY4eHh+vnnnzVu3Dht2rRJJ06c0Pbt25WamuouZZMnT9bOnTsVGxvrnsVas2aNnn32WUnSZ599pv/5n/9Renq6Tpw4offff18ul8vrQ2XAzYQyA9xEZs2aVeTwSHh4uN58800tXLhQkZGRSklJKfZKn+sxZ84czZ07V5GRkdq6das+/fRT3XrrrZKkkJAQbd++XYWFherbt6/atGmjuLg4BQYGepyfUxbjx4/XxIkTNXHiRLVt21br1q3TmjVrFBYW5tV+5s+fry5duuiBBx5Qr169FB0drfDwcFWrVs39nFdffVWhoaHq3r27hg0bpueff17Vq1d3P169enVt2bJFjRo10uDBgxUeHq6YmBj9/PPPqlWrlqpXr65Dhw7pT3/6k1q0aKGnn35a48aN05gxY+Tn56czZ87oiSeeUIsWLTRkyBD169dPL7/8siSpXbt22rx5s44cOaJu3bqpQ4cOeumllxQcHCzp10vEP/74Y917770KDw/XW2+9pRUrVigiIsKrzwG4mTis3/7NBwB/IBcvXlSDBg306quv6sknn7Q7DoDrUNnuAABwI+3du1eHDh3SnXfeqdzcXM2cOVOSNGjQIJuTAbhelBkAfzh//etflZmZqapVq6pjx47aunWr+9AYAPNwmAkAABiNE4ABAIDRKDMAAMBolBkAAGA0ygwAADAaZQYAABiNMgMAAIxGmQEAAEajzAAAAKP9/2VxcH7xE1AYAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "report_minimizing_tree(max, ails)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the max of partition sizes over 9 targets; inconsistent guesses allowed\n",
      "first guess: \"BERTH\"\n",
      "median: 3 guesses, mean: 2.56 ± 0.53, worst: 3, best: 2\n",
      "cumulative: ≤2:44%, ≤3:100%, ≤4:100%, ≤5:100%, ≤6:100%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n"
     ]
    },
    {
     "data": {
      "image/png": "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gMvyuMw89NBDunDhgqZNm6azZ88qPj5erVq10oIFC3TffffVRkYAAIDL8qjMXLhwQX/5y180YsQIPfroozpx4oQqKirUsmXL2soHAABwRR5dM+Pj46Pf//73KisrkyTdcMMNFBkAAGArjy8A7tu3r3bv3l0bWQAAADzm8TUzEyZM0JQpU3Ts2DH16dNHDRs2dNves2fPGgsHAABQFY/LzOjRoyVJkydPdo05HA5ZliWHw+G6IzAAAMC14HGZyc/Pr40cAAAAV8XjMtO2bdvayAEAAHBVPC4zkvT1119r/vz52rdvnxwOh7p06aKEhAR16NChpvMBAABckcefZlq/fr26du2q7du3q2fPnurevbu++OILdevWTRkZGbWREQAA4LI8npmZPn26nnrqKc2ZM6fS+DPPPKPBgwfXWDgAAICqeDwzs2/fPj388MOVxsePH6+vvvqqRkIBAABUl8dlpkWLFpf81uycnBzuBgwAAK45j08zPfroo3rsscd0+PBhRUVFyeFwaOvWrZo7d66mTJlSGxkBAAAuy+My89xzz8nf318vv/yyZsyYIUkKCQlRcnKy2430AAAArgWPTzM5HA499dRTOnbsmIqLi1VcXKxjx44pISFBDofDo2MtWrRIPXv2VOPGjdW4cWP169dPa9eudW23LEvJyckKCQmRr6+vYmJilJub62lkAABwHfO4zOTn5ysvL0+S5O/vL39/f0lSXl6ejhw54tGxWrdurTlz5mjHjh3asWOH7rjjDo0cOdJVWNLS0jRv3jylp6crOztbQUFBGjx4sEpLSz2NDQAArlMel5lx48YpKyur0vgXX3yhcePGeXSsESNGaNiwYerYsaM6duyol156SY0aNdK2bdtkWZbmz5+vmTNnKi4uTt27d9eyZct09uxZLV++3NPYAADgOuVxmdm9e7f69+9fafzWW2+95Kecqqu8vFwrV67UmTNn1K9fP+Xn56uwsFBDhgxx7eN0OhUdHX3JMnVRWVmZSkpK3BYAAHD9uqprZi51mqe4uPiqvjF77969atSokZxOp5544gmtXr1aXbt2VWFhoSQpMDDQbf/AwEDXtktJTU1VQECAawkNDfU4EwAAMIfHZea2225TamqqW3EpLy9XamqqBgwY4HGATp06KScnR9u2bdPvf/97jR071u3me7+8qNiyrCteaDxjxgzXhcnF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NbM5SfWVl5dr5cqVOnPmjPr162d3nCpNnDhRw4cP16BBg+yOUm15eXkKCQlRWFiY7rvvPh0+fNjuSFe0Zs0aRUZG6re//a1atmyp3r17680337Q7lkfOnz+vP//5zxo/frxXf7nugAED9I9//EMHDx6UJH355ZfaunWrhg0bZnOyK7tw4YLKy8vVoEEDt3FfX19t3brVplSeyc/PV2FhoYYMGeIaczqdio6OVlZWlo3Jrp7X3wEY3s+yLCUlJWnAgAHq3r273XGqtHfvXvXr108//vijGjVqpNWrV6tr1652x7qilStXateuXV53Xv5K+vbtq3feeUcdO3bUd999pxdffFFRUVHKzc1V8+bN7Y53SYcPH9aiRYuUlJSkZ599Vtu3b9fkyZPldDr14IMP2h2vWj744AOdPn1a48aNszvKFT3zzDMqLi5W586dVbduXZWXl+ull17S/fffb3e0K/L391e/fv30wgsvqEuXLgoMDNSKFSv0xRdfKDw83O541XLxy5t/+YXNgYGBOnr0qB2RfjXKDH61SZMmac+ePcb8q6RTp07KycnR6dOn9d5772ns2LHKzMz02kJTUFCghIQEbdiwodK/Br1ZbGys6889evRQv3791KFDBy1btkxJSUk2Jru8iooKRUZGKiUlRZLUu3dv5ebmatGiRcaUmbfffluxsbEKCQmxO8oVrVq1Sn/+85+1fPlydevWTTk5OUpMTFRISIjGjh1rd7wrevfddzV+/Hi1atVKdevW1U033aT4+Hjt2rXL7mge+eXMnWVZXj2bdyWUGfwqTz75pNasWaPNmzerdevWdseplvr16+vGG2+UJEVGRio7O1sLFizQG2+8YXOyS9u5c6eKiorUp08f11h5ebk2b96s9PR0lZWVqW7dujYmrJ6GDRuqR48eysvLszvKZQUHB1cqtV26dNF7771nUyLPHD16VJ988onef/99u6NUaerUqZo+fbruu+8+ST8X3qNHjyo1NdXry0yHDh2UmZmpM2fOqKSkRMHBwRo9erTCwsLsjlYtFz9VWFhYqODgYNd4UVFRpdkaU3DNDK6KZVmaNGmS3n//fW3cuNGYv8SXYlmWysrK7I5xWXfeeaf27t2rnJwc1xIZGakxY8YoJyfHiCIjSWVlZdq3b5/bL09v079//0q3GDh48KAxX2y7ZMkStWzZUsOHD7c7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ZKT27dsnSdq5c6c+/fRTNWrUyLV07txZ0s/Xt1wUGRl5xWwlJSX69ttv1b9/f7fx/v37u56rOg4fPqyffvpJt9xyi2ssICBAnTp1qvYxpJ9/rkOHDsnf39/1czVr1kw//vijvv76azVr1kzjxo3T0KFDNWLECC1YsEDHjx93PT4pKUmPPPKIBg0apDlz5ri9Fjt37tTSpUvdXrOhQ4eqoqJC+fn5Gjx4sNq2bav27dvrgQce0F/+8hedPXvWo/zA9YYyA1wHBg4cqKFDh+rZZ5+ttK1OnTqyLMtt7Keffqq038XTHBc5HI5LjlVUVFSZ5+LplIqKCo0YMUI5OTluS15entupkYYNG1Z5zH897kWWZXn0ya2Lr8OljvPL57nSa1ZRUaE+ffpU+rkOHjyo+Ph4SdKSJUv0+eefKyoqSqtWrVLHjh21bds2ST9fx5Sbm6vhw4dr48aN6tq1q1avXu069uOPP+523C+//FJ5eXnq0KGD/P39tWvXLq1YsULBwcH67//+b0VEROj06dPVfh2A6w1lBrhOzJkzR3/729+UlZXlNt6iRQsVFha6vTnX5L1hLr5BS9KFCxe0c+dO1+zLTTfdpNzcXLVr10433nij21LdAiNJjRs3VkhIiLZu3eo2npWVpS5dulT7OB06dFC9evW0fft211hJSYnrupuLWrRo4TaTkpeX5zb7cdNNNykvL08tW7as9HMFBAS49uvdu7dmzJihrKwsde/eXcuXL3dt69ixo5566ilt2LBBcXFxWrJkievYubm5lY574403qn79+pJ+ngEbNGiQ0tLStGfPHh05ckQbN26s9usAXG8oM8B1okePHhozZoxeffVVt/GYmBj93//9n9LS0vT1119r4cKFWrt2bY0978KFC7V69Wrt379fEydO1KlTpzR+/HhJ0sSJE/X999/r/vvv1/bt23X48GFt2LBB48ePV3l5uUfPM3XqVM2dO1erVq3SgQMHNH36dOXk5CghIaHax/D399fYsWM1depUffrpp8rNzdX48eNVp04dt9maO+64Q+np6dq1a5d27NihJ554wm2WasyYMbrhhhs0cuRIbdmyRfn5+crMzFRCQoKOHTum/Px8zZgxQ59//rmOHj2qDRs26ODBg+rSpYvOnTunSZMmadOmTTp69Kg+++wzZWdnu0rZM888o88//1wTJ050zWKtWbNGTz75pCTpo48+0h//+Efl5OTo6NGjeuedd1RRUeHxqTLgekKZAa4jL7zwQqXTI126dNFrr72mhQsXKiIiQtu3b7/sJ32uxpw5czR37lxFRERoy5Yt+vDDD3XDDTdIkkJCQvTZZ5+pvLxcQ4cOVffu3ZWQkKCAgAC363OqY/LkyZoyZYqmTJmiHj16aN26dVqzZo3Cw8M9Os68efPUr18//eY3v9GgQYPUv39/denSRQ0aNHDt8/LLLys0NFQDBw5UfHy8nn76afn5+bm2+/n5afPmzWrTpo3i4uLUpUsXjR8/XufOnVPjxo3l5+en/fv3695771XHjh312GOPadKkSXr88cdVt25dnTx5Ug8++KA6duyoUaNGKTY2Vs8//7wkqWfPnsrMzFReXp5uu+029e7dW88995yCg4Ml/fwR8ffff1933HGHunTpotdff10rVqxQt27dPHodgOuJw/rlbz4A+Ddy5swZtWrVSi+//LIefvhhu+MAuAo+dgcAgGtp9+7d2r9/v2655RYVFxdr9uzZkqSRI0fanAzA1aLMAPi384c//EEHDhxQ/fr11adPH23ZssV1agyAeTjNBAAAjMYFwAAAwGiUGQAAYDTKDAAAMBplBgAAGI0yAwAAjEaZAQAARqPMAAAAo1FmAACA0f4f1i3IVOjfGK8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "report_minimizing_tree(max, ails, inconsistent=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that allowing inconsistent guesses improves the mean number of guesses (across all possible targets) from 5.00 to 2.56.\n",
    "\n",
    "# Reports on Consistent Wordle Guessers\n",
    "\n",
    "Here are reports on trees made from minimizing each of the three metrics (max, expectation, and entropy), with only consistent guesses allowed: "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the max of partition sizes over 2,309 targets; inconsistent guesses prohibited\n",
      "first guess: \"ARISE\"\n",
      "median: 4 guesses, mean: 3.68 ± 0.86, worst: 8, best: 1\n",
      "cumulative: ≤2:5%, ≤3:43%, ≤4:87%, ≤5:97%, ≤6:99.4%, ≤7:99.9%, ≤8:100%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 3.17 s, sys: 176 ms, total: 3.34 s\n",
      "Wall time: 1.66 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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Op1W165drSVLltgdqVbWr19vSbL2799vd5RaKSkpsRITE622bdtajRs3tjp27GjNnDnTKisrsztajVatWmV17NjRatSokRUUFGQlJCRYJ0+etDuWm5reVyorK61Zs2ZZQUFBltPptAYNGmTt2bPH3tCXwWFZlnXFGxQAAEAd4ZoZAABgNMoMAAAwGmUGAAAYjTIDAACMRpkBAABGo8wAAACjUWYAAIDRKDMAAMBolBkAl+TIkSNyOBzKy8uzO4rLvn37dOutt6px48bq2bOn3XEAXCGUGcBQEyZMkMPhUHp6utv4u+++K4fDYVMqe82aNUtNmzbV/v379c9//tPuOACuEMoMYLDGjRtr7ty5OnHihN1R6sy5c+cu+bFffPGFBgwYoHbt2qlVq1Z1mAqAN6PMAAYbMmSIgoKClJaWdtF9UlJSqpxyWbBggdq3b+9anzBhgu666y6lpqYqMDBQLVq00DPPPKPy8nJNnTpVLVu2VJs2bfSnP/2pyvH37dunqKgoNW7cWOHh4dq0aZPb9r1792rEiBFq1qyZAgMDdc899+i7775zbR88eLAmTZqk5ORkXXvttRo6dOgFf47KykrNnj1bbdq0kdPpVM+ePd2+7dzhcCg3N1ezZ8+Ww+FQSkrKBY9TWlqqcePGqWnTpgoODtaLL76owYMHKykpye1Y7777rtvjWrRooWXLlrnWv/76a40dO1bXXHONWrVqpdGjR+vIkSOu7Zs2bdItt9yipk2bqkWLFurfv7+OHj0qSfrss8902223yd/fX82bN1fv3r21Y8cO12Ozs7M1aNAg+fn5KTQ0VJMnT9bp06dd219++WWFhYWpcePGCgwM1H/+539e8GcF/l1QZgCD+fj4KDU1VS+99JK++uqryzrWxo0b9c0332jz5s2aP3++UlJS9Ktf/UrXXHONPv30Uz3yyCN65JFHVFhY6Pa4qVOnasqUKdq1a5eioqL061//WsePH5ckHTt2TNHR0erZs6d27NihdevW6dtvv9WYMWPcjrF8+XL5+vpq27ZtevXVVy+Yb+HChXrhhRf0hz/8Qbt379awYcP061//WgcPHnQ9V3h4uKZMmaJjx47piSeeuOBxkpOTtW3bNq1Zs0aZmZnasmWLdu7c6dFrdebMGd12221q1qyZNm/erK1bt6pZs2a68847de7cOZWXl+uuu+5SdHS0du/erY8//lgPPfSQ6/TfuHHj1KZNG+Xk5Cg3N1fTp09Xw4YNJUl79uzRsGHDFBsbq927d2vVqlXaunWrJk2aJEnasWOHJk+erNmzZ2v//v1at26dBg0a5FF+4Kpj99d2A7g048ePt0aPHm1ZlmXdeuutVnx8vGVZlrV69Wrrl3+1Z82aZUVGRro99sUXX7TatWvndqx27dpZFRUVrrEuXbpYAwcOdK2Xl5dbTZs2td566y3LsiyroKDAkmSlp6e79vnpp5+sNm3aWHPnzrUsy7KefvppKyYmxu25CwsLLUnW/v37LcuyrOjoaKtnz541/rwhISHWnDlz3MZuvvlma+LEia71yMhIa9asWRc9RklJidWwYUPrb3/7m2vs5MmTVpMmTazExETXmCRr9erVbo8NCAiwli5dalmWZb3xxhtWly5drMrKStf2srIyy8/Pz1q/fr11/PhxS5K1adOmC+bw9/e3li1bdsFt99xzj/XQQw+5jW3ZssVq0KCBdfbsWevtt9+2mjdvbpWUlFz05wT+3TAzA1wF5s6dq+XLl2vv3r2XfIzw8HA1aPD/fyUEBgbqxhtvdK37+PioVatWKi4udntcv379XH/29fVVnz599Pnnn0uScnNz9dFHH6lZs2aupWvXrpJ+vr7lvD59+lSbraSkRN9884369+/vNt6/f3/Xc9XG4cOH9dNPP+mWW25xjQUEBKhLly61Pob088916NAh+fv7u36uli1b6scff9QXX3yhli1basKECRo2bJhGjRqlhQsX6tixY67HJycn64EHHtCQIUOUnp7u9lrk5uZq2bJlbq/ZsGHDVFlZqYKCAg0dOlTt2rVTx44ddc899+ivf/2rzpw541F+4GpDmQGuAoMGDdKwYcP01FNPVdnWoEEDWZblNvbTTz9V2e/8aY7zHA7HBccqKytrzHP+dEplZaVGjRqlvLw8t+XgwYNup0aaNm1a4zF/edzzLMvy6JNb51+HCx3nX5+nutessrJSvXv3rvJzHThwQHFxcZKkpUuX6uOPP1ZUVJRWrVqlzp0765NPPpH083VM+fn5GjlypDZu3Kju3btr9erVrmM//PDDbsf97LPPdPDgQXXq1En+/v7auXOn3nrrLQUHB+u///u/FRkZqZMnT9b6dQCuNpQZ4CqRnp6uv//978rOznYbv+6661RUVOT25lyX94Y5/wYtSeXl5crNzXXNvtx0003Kz89X+/btdcMNN7gttS0wktS8eXOFhIRo69atbuPZ2dnq1q1brY/TqVMnNWzYUNu3b3eNlZSUuK67Oe+6665zm0k5ePCg2+zHTTfdpIMHD6p169ZVfq6AgADXfr169dKMGTOUnZ2tiIgIrVixwrWtc+fOevzxx7VhwwbFxsZq6dKlrmPn5+dXOe4NN9ygRo0aSfp5BmzIkCGaN2+edu/erSNHjmjjxo21fh2Aqw1lBrhK3HjjjRo3bpxeeuklt/HBgwfrf//3fzVv3jx98cUXWrRokdauXVtnz7to0SKtXr1a+/btU0JCgk6cOKH4+HhJUkJCgr7//nv97ne/0/bt23X48GFt2LBB8fHxqqio8Oh5pk6dqrlz52rVqlXav3+/pk+frry8PCUmJtb6GP7+/ho/frymTp2qjz76SPn5+YqPj1eDBg3cZmtuv/12ZWRkaOfOndqxY4ceeeQRt1mqcePG6dprr9Xo0aO1ZcsWFRQUKCsrS4mJifrqq69UUFCgGTNm6OOPP9bRo0e1YcMGHThwQN26ddPZs2c1adIkbdq0SUePHtW2bduUk5PjKmVPPvmkPv74YyUkJLhmsdasWaPHHntMkvT+++/rj3/8o/Ly8nT06FH9+c9/VmVlpcenyoCrCWUGuIo8++yzVU6PdOvWTS+//LIWLVqkyMhIbd++/aKf9LkU6enpmjt3riIjI7Vlyxa99957uvbaayVJISEh2rZtmyoqKjRs2DBFREQoMTFRAQEBbtfn1MbkyZM1ZcoUTZkyRTfeeKPWrVunNWvWKCwszKPjzJ8/X/369dOvfvUrDRkyRP3791e3bt3UuHFj1z4vvPCCQkNDNWjQIMXFxemJJ55QkyZNXNubNGmizZs3q23btoqNjVW3bt0UHx+vs2fPqnnz5mrSpIn27dun3/zmN+rcubMeeughTZo0SQ8//LB8fHx0/Phx3XvvvercubPGjBmj4cOH65lnnpEk9ejRQ1lZWTp48KAGDhyoXr166emnn1ZwcLCknz8i/s477+j2229Xt27d9Morr+itt95SeHi4R68DcDVxWP/6mw8A/o2cPn1a119/vV544QXdf//9dscBcAl87Q4AAFfSrl27tG/fPt1yyy06deqUZs+eLUkaPXq0zckAXCrKDIB/O3/4wx+0f/9+NWrUSL1799aWLVtcp8YAmIfTTAAAwGhcAAwAAIxGmQEAAEajzAAAAKNRZgAAgNEoMwAAwGiUGQAAYDTKDAAAMBplBgAAGO3/ADcn/CywIG+SAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(max, inconsistent=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the expectation of partition sizes over 2,309 targets; inconsistent guesses prohibited\n",
      "first guess: \"RAISE\"\n",
      "median: 4 guesses, mean: 3.62 ± 0.86, worst: 8, best: 1\n",
      "cumulative: ≤2:6%, ≤3:47%, ≤4:88%, ≤5:98%, ≤6:99.4%, ≤7:99.9%, ≤8:100%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 3.2 s, sys: 277 ms, total: 3.48 s\n",
      "Wall time: 1.68 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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jzyi06dPa8qUKTp27JgGDBigTZs2XZRPUwEAAPP4XGZiYmKUnZ2tP/3pT17j2dnZiomJ8elYlmU1uI/D4VB6errS09N9OjYAAPjP4HOZWbhwocaMGaO3335bcXFxcjgc2rZtm0pLS/XWW29djIwAAADn5fMFwAkJCfr00091yy23qKKiQt98842Sk5O1f/9+DRky5GJkBAAAOC+fZ2YkKTw83KcLfQEAAC4Wn2dmAAAA/AllBgAAGI0yAwAAjEaZAQAARrugC4DP+vrrr/Xhhx+qpqZGN9xwg1wuV1PlAgAAaJQLLjNr1qzRXXfdpe7du+u7777T/v379fTTT+u3v/1tU+YDAACoV6NPM504ccJr/fHHH9f27du1fft27d69W3//+981Z86cJg8IAABQn0aXmf79++v111/3rDdr1kzl5eWe9a+++kotWrRo2nQAAAANaPRppo0bN2rKlCl64YUX9PTTT2vp0qUaP368ampqVF1drSuuuEIvvPDCRYwKAABQV6PLTJcuXfTWW29p5cqVSkhI0LRp03TgwAEdOHBANTU1uu6669SyZcuLmRUAAKAOnz+anZKS4rlOJjExUbW1terXrx9FBgAA2MKnTzOtX79eH3/8sWJiYvT8888rLy9PKSkpuummmzRv3jwFBgZerJwAAADn1OiZmUceeUSTJk1SQUGB7r33Xj3xxBNKTEzU7t275XQ61a9fP61fv/5iZgUAAKij0WXmr3/9q9566y2tWrVKBQUFeumllyRJLVq00O9//3u9+uqr3EkbAABcco0uM61atVJJSYkkqbS0tM41Mr1799bWrVubNh0AAEADGl1mMjMzdeeddyo8PFwJCQl64oknLmYuAACARmn0BcATJkzQjTfeqIMHDyoqKkpt27a9iLEAAAAax6dPM7Vv317t27e/WFkAAAB85vP3zAAAAPgTygwAADAaZQYAABiNMgMAAIxGmQEAAEajzAAAAKNRZgAAgNEoMwAAwGiUGQAAYDTKDAAAMJqtZWbLli0aO3aswsPD5XA49Nprr3ltnzRpkhwOh9cycOBAe8ICAAC/ZGuZOXnypGJiYpSdnX3efW688UYdOXLEs7z11luXMCEAAPB3Pt1osqklJSUpKSmp3n2cTqfCwsIuUSIAAGAav79mJi8vTx07dlT37t119913q7y8vN79q6qq5Ha7vRYA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l156SUVFRRo1apRGjBihL774wu5oHg29ryxcuFCLFy9Wdna2CgoKFBYWppEjR6qysvISJ20iP/ZmkGhakqy1a9faHcNn5eXlliQrPz/f7ig+u/LKK63nnnvO7hgNqqystKKioqzc3FwrISHBmjZtmt2R6jV37lwrJibG7hg+efTRR63BgwfbHeNHmzZtmtWtWzertrbW7ijnNWbMGGvy5MleY8nJydZvfvMbmxI1zqlTp6yAgADrjTfe8BqPiYmx5syZY1Oq+v3wfaW2ttYKCwuzsrKyPGPffvutFRISYv3lL3+xIeGPx8wMmsTx48clSe3atbM5SePV1NRo1apVOnnypOLi4uyO06DU1FSNGTNGI0aMsDtKoxUXFys8PFxdu3bV7bffroMHD9odqV7r1q1TbGysfvWrX6ljx466/vrr9eyzz9odyydnzpzR3/72N02ePNmvb647ePBg/fOf/9Snn34qSfroo4+0detW3XTTTTYnq191dbVqamrUsmVLr/HAwEBt3brVplS+KSkpUVlZmUaNGuUZczqdSkhI0LZt22xMduH8/huA4f8sy1JaWpoGDx6s6Ohou+M0qKioSHFxcfr222/Vpk0brV27Vr169bI7Vr1WrVqlXbt2+d15+foMGDBAL774orp3766vvvpKv//97xUfH6+9e/eqffv2dsc7p4MHD2rZsmVKS0vT7NmztX37dj3wwANyOp2688477Y7XKK+99poqKio0adIku6PU69FHH9Xx48d13XXXKSAgQDU1NZo/f75+/etf2x2tXkFBQYqLi9MTTzyhnj17KjQ0VK+88oo+/PBDRUVF2R2vUc7evPmHN2wODQ3V4cOH7Yj0o1Fm8KNNnTpVe/bsMeZfJT169FBhYaEqKiq0Zs0aTZw4Ufn5+X5baEpLSzVt2jRt2rSpzr8G/VlSUpLn5z59+iguLk7dunXTihUrlJaWZmOy86utrVVsbKwyMjIkSddff7327t2rZcuWGVNmnn/+eSUlJSk8PNzuKPVavXq1/va3v2nlypXq3bu3CgsLNX36dIWHh2vixIl2x6vXSy+9pMmTJ+vqq69WQECAfvKTnyglJUW7du2yO5pPfjhzZ1mWX8/m1Ycygx/l/vvv17p167RlyxZ16tTJ7jiN0qJFC1177bWSpNjYWBUUFGjp0qV65plnbE52bjt37lR5ebn6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a//+/ZZlWVZCQoLVr1+/Bn/f8PBwa/78+V5jN9xwgzVlyhTPekxMjDV37tzzHsPtdlvNmze3/v73v3vGKioqrFatWlnTpk3zjEmy1q5d6/XYkJAQKycnx7Isy3r++eetHj16WLW1tZ7tVVVVVmBgoLVx40br6NGjliQrLy/vnDmCgoKsF1544Zzb7rjjDuuee+7xGnv33XetK664wjp9+rS1Zs0aKzg42HK73ef9PYH/NMzMAJeBBQsWaMWKFfr4448v+Bi9e/fWFVf8v78SQkND1adPH896QECA2rdvr/Lycq/HxcXFeX5u1qyZYmNjtW/fPknSzp079c4776hNmzae5brrrpP0/fUtZ8XGxtabze1268svv9SgQYO8xgcNGuR5rsY4ePCgvvvuO/30pz/1jIWEhKhHjx6NPob0/e914MABBQUFeX6vdu3a6dtvv9Vnn32mdu3aadKkSRo9erTGjh2rpUuX6siRI57Hp6Wl6Xe/+51GjBihrKwsr9di586deuGFF7xes9GjR6u2tlYlJSUaOXKkIiMjdc011+iOO+7Qyy+/rFOnTvmUH7jcUGaAy8DQoUM1evRozZ49u862K664QpZleY199913dfY7e5rjLIfDcc6x2traBvOcPZ1SW1ursWPHqrCw0GspLi72OjXSunXrBo/578c9y7Isnz65dfZ1ONdxfvg89b1mtbW16t+/f53f69NPP1VKSookKScnR++//77i4+O1evVqde/eXR988IGk769j2rt3r8aMGaPNmzerV69eWrt2refY9957r9dxP/roIxUXF6tbt24KCgrSrl279Morr8jlcul//ud/FBMTo4qKika/DsDlhjIDXCaysrL0j3/8Q9u2bfMav+qqq1RWVub15tyU3w1z9g1akqqrq7Vz507P7MtPfvIT7d27V126dNG1117rtTS2wEhScHCwwsPDtXXrVq/xbdu2qWfPno0+Trdu3dS8eXNt377dM+Z2uz3X3Zx11VVXec2kFBcXe81+/OQnP1FxcbE6duxY5/cKCQnx7Hf99ddr1qxZ2rZtm6Kjo7Vy5UrPtu7du+vBBx/Upk2blJycrJycHM+x9+7dW+e41157rVq0aCHp+xmwESNGaOHChdqzZ48OHTqkzZs3N/p1AC43lBngMtGnTx9NmDBBTz31lNd4YmKi/u///k8LFy7UZ599pqefflrr169vsud9+umntXbtWn3yySdKTU3VsWPHNHnyZElSamqqvvnmG/3617/W9u3bdfDgQW3atEmTJ09WTU2NT88zY8YMLViwQKtXr9b+/fs1c+ZMFRYWatq0aY0+RlBQkCZOnKgZM2bonXfe0d69ezV58mRdccUVXrM1w4cPV3Z2tnbt2qUdO3bovvvu85qlmjBhgjp06KBx48bp3XffVUlJifLz8zVt2jR9/vnnKikp0axZs/T+++/r8OHD2rRpkz799FP17NlTp0+f1tSpU5WXl6fDhw/rvffeU0FBgaeUPfroo3r//feVmprqmcVat26d7r//fknSG2+8oT/96U8qLCzU4cOH9eKLL6q2ttbnU2XA5YQyA1xGnnjiiTqnR3r27Kk///nPevrppxUTE6Pt27ef95M+FyIrK0sLFixQTEyM3n33Xb3++uvq0KGDJCk8PFzvvfeeampqNHr0aEVHR2vatGkKCQnxuj6nMR544AE99NBDeuihh9SnTx9t2LBB69atU1RUlE/HWbx4seLi4vTzn/9cI0aM0KBBg9SzZ0+1bNnSs8+iRYsUERGhoUOHKiUlRQ8//LBatWrl2d6qVStt2bJFnTt3VnJysnr27KnJkyfr9OnTCg4OVqtWrfTJJ5/o1ltvVffu3XXPPfdo6tSpuvfeexUQEKCjR4/qzjvvVPfu3XXbbbcpKSlJjz/+uCSpb9++ys/PV3FxsYYMGaLrr79ejz32mFwul6TvPyL+6quvavjw4erZs6f+8pe/6JVXXlHv3r19eh2Ay4nD+uHffADwH+TkyZO6+uqrtWjRIt111112xwFwAZrZHQAALqXdu3frk08+0U9/+lMdP35c8+bNkySNGzfO5mQALhRlBsB/nD/+8Y/av3+/WrRoof79++vdd9/1nBoDYB5OMwEAAKNxATAAADAaZQYAABiNMgMAAIxGmQEAAEajzAAAAKNRZgAAgNEoMwAAwGiUGQAAYLT/H+PYHGthUL/sAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(expectation, inconsistent=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the neg_entropy of partition sizes over 2,309 targets; inconsistent guesses prohibited\n",
      "first guess: \"RAISE\"\n",
      "median: 4 guesses, mean: 3.60 ± 0.85, worst: 8, best: 1\n",
      "cumulative: ≤2:6%, ≤3:49%, ≤4:89%, ≤5:97%, ≤6:99.5%, ≤7:99.9%, ≤8:100%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 2.92 s, sys: 179 ms, total: 3.1 s\n",
      "Wall time: 1.88 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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goICe8I2AMqMFzh9+rQiIiKUmZlpd5R6y87OVmJioj799FNlZWWpsrJSsbGxOn36tN3RatWuXTtlZGRo586d2rlzp+68806NHj3amL/Eubm5Wrp0qXr37m13lHrp1auXjh075lr27t1rd6RanThxQgMHDlSTJk20fv167du3Ty+++KLX30U8NzfX7XU+f6PRX//61zYnu7h58+bp1VdfVWZmpr744gvNnz9fv/vd7/Tyyy/bHa1ODz30kLKysvTWW29p7969io2N1dChQ/X111/bHc2lrveV+fPna8GCBcrMzFRubq6CgoI0bNgwlZeXX+WkDeRyvwwSDUuStXbtWrtjeKy0tNSSZGVnZ9sdxWPXXXed9cYbb9gdo07l5eVWWFiYlZWVZUVHR1tJSUl2R6rV7NmzrYiICLtjeOTpp5+2Bg0aZHeMy5aUlGR16dLFqq6utjvKRY0cOdKaOHGi21h8fLz129/+1qZE9XPmzBnLx8fHev/9993GIyIirFmzZtmUqnb/+r5SXV1tBQUFWRkZGa6xH3/80fL397deffVVGxJePmZm0CBOnTolSWrTpo3NSeqvqqpKq1ev1unTpxUZGWl3nDolJiZq5MiRGjp0qN1R6u3gwYMKCQlRp06ddO+99+rw4cN2R6rVunXr1L9/f/36179W27Zt1bdvX73++ut2x/LIuXPn9Kc//UkTJ0706i/XHTRokP7+97/rwIEDkqTPP/9c27dv14gRI2xOVrvKykpVVVWpWbNmbuO+vr7avn27Tak8U1RUpJKSEsXGxrrGnE6noqOjlZOTY2OyS+f1dwCG97MsSykpKRo0aJDCw8PtjlOnvXv3KjIyUj/++KNatmyptWvXqmfPnnbHqtXq1au1a9curzsvX5sBAwboj3/8o7p27apvv/1WL7zwgqKiolRQUKCAgAC7413Q4cOHtWTJEqWkpOiZZ57Rjh07NGXKFDmdTt1///12x6uXd999VydPntSECRPsjlKrp59+WqdOnVL37t3l4+OjqqoqzZ07V7/5zW/sjlYrPz8/RUZG6vnnn1ePHj0UGBioVatW6bPPPlNYWJjd8erl/Jc3/+sXNgcGBuro0aN2RLpslBlctsmTJ2vPnj3G/KukW7duys/P18mTJ/X2229r/Pjxys7O9tpCU1xcrKSkJG3atKnGvwa9WVxcnOvPN998syIjI9WlSxetWLFCKSkpNia7uOrqavXv319paWmSpL59+6qgoEBLliwxpsy8+eabiouLU0hIiN1RarVmzRr96U9/0sqVK9WrVy/l5+crOTlZISEhGj9+vN3xavXWW29p4sSJuvHGG+Xj46NbbrlFCQkJ2rVrl93RPPKvM3eWZXn1bF5tKDO4LE888YTWrVunrVu3ql27dnbHqZemTZvqpptukiT1799fubm5WrRokV577TWbk11YXl6eSktL1a9fP9dYVVWVtm7dqszMTFVUVMjHx8fGhPXTokUL3XzzzTp48KDdUS4qODi4Rqnt0aOH3n77bZsSeebo0aP68MMP9c4779gdpU7Tpk3TjBkzdO+990r6ufAePXpU6enpXl9munTpouzsbJ0+fVplZWUKDg7W2LFj1alTJ7uj1cv5TxWWlJQoODjYNV5aWlpjtsYUXDODS2JZliZPnqx33nlHmzdvNuYv8YVYlqWKigq7Y1zUXXfdpb179yo/P9+19O/fX+PGjVN+fr4RRUaSKioq9MUXX7j98vQ2AwcOrHGLgQMHDhjzxbbLli1T27ZtNXLkSLuj1OnMmTNq1Mj9LcjHx8eIj2af16JFCwUHB+vEiRPauHGjRo8ebXekeunUqZOCgoJcn3qTfr7WKjs7W1FRUTYmu3TMzHiBH374QYcOHXKtFxUVKT8/X23atFH79u1tTHZxiYmJWrlypd577z35+fm5zsH6+/vL19fX5nQX98wzzyguLk6hoaEqLy/X6tWrtWXLFm3YsMHuaBfl5+dX41qkFi1aKCAgwKuvUXrqqac0atQotW/fXqWlpXrhhRdUVlbm1f/qfvLJJxUVFaW0tDSNGTNGO3bs0NKlS7V06VK7o9Wpurpay5Yt0/jx49W4sff/ah81apTmzp2r9u3bq1evXtq9e7cWLFigiRMn2h2tThs3bpRlWerWrZsOHTqkadOmqVu3bnrggQfsjuZS1/tKcnKy0tLSFBYWprCwMKWlpal58+ZKSEiwMfVlsPWzVLAsy7I++ugjS1KNZfz48XZHu6gL5ZVkLVu2zO5otZo4caLVoUMHq2nTptYNN9xg3XXXXdamTZvsjuUxEz6aPXbsWCs4ONhq0qSJFRISYsXHx1sFBQV2x6rTX//6Vys8PNxyOp1W9+7draVLl9odqV42btxoSbIKCwvtjlIvZWVlVlJSktW+fXurWbNmVufOna1Zs2ZZFRUVdker05o1a6zOnTtbTZs2tYKCgqzExETr5MmTdsdyU9f7SnV1tTV79mwrKCjIcjqd1pAhQ6y9e/faG/oyOCzLsq56gwIAAGggXDMDAACMRpkBAABGo8wAAACjUWYAAIDRKDMAAMBolBkAAGA0ygwAADAaZQYAABiNMgPgkhw5ckQOh0P5+fl2R3HZv3+/br/9djVr1kx9+vSxOw6Aq4QyAxhqwoQJcjgcysjIcBt/99135XA4bEplr9mzZ6tFixYqLCzU3//+d7vjALhKKDOAwZo1a6Z58+bpxIkTdkdpMOfOnbvkx3755ZcaNGiQOnTooICAgAZMBcCbUWYAgw0dOlRBQUFKT0+/6D6pqak1TrksXLhQHTt2dK1PmDBB99xzj9LS0hQYGKjWrVvrueeeU2VlpaZNm6Y2bdqoXbt2+sMf/lDj+Pv371dUVJSaNWumXr16acuWLW7b9+3bpxEjRqhly5YKDAzUfffdp++++861PSYmRpMnT1ZKSoquv/56DRs27II/R3V1tebMmaN27drJ6XSqT58+bt927nA4lJeXpzlz5sjhcCg1NfWCxykvL9e4cePUokULBQcH66WXXlJMTIySk5PdjvXuu++6Pa5169Zavny5a/3rr7/W2LFjdd111ykgIECjR4/WkSNHXNu3bNmi2267TS1atFDr1q01cOBAHT16VJL0+eef64477pCfn59atWqlfv36aefOna7H5uTkaMiQIfL19VVoaKimTJmi06dPu7a/8sorCgsLU7NmzRQYGKj//M//vODPCvy7oMwABvPx8VFaWppefvllffXVV5d1rM2bN+ubb77R1q1btWDBAqWmpuoXv/iFrrvuOn322Wd67LHH9Nhjj6m4uNjtcdOmTdPUqVO1e/duRUVF6Ze//KWOHz8uSTp27Jiio6PVp08f7dy5Uxs2bNC3336rMWPGuB1jxYoVaty4sT7++GO99tprF8y3aNEivfjii/r973+vPXv2aPjw4frlL3+pgwcPup6rV69emjp1qo4dO6annnrqgsdJSUnRxx9/rHXr1ikrK0vbtm3Trl27PHqtzpw5ozvuuEMtW7bU1q1btX37drVs2VJ33323zp07p8rKSt1zzz2Kjo7Wnj179Mknn+iRRx5xnf4bN26c2rVrp9zcXOXl5WnGjBlq0qSJ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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(neg_entropy, inconsistent=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that `neg_entropy` gives the best mean number of guesses, 3.60, and the best winning percentage (99.5% in 6 guesses or less).\n",
    "\n",
    "The random guesser is also a consistent guesser. Here is a report on it (each run will give slightly different results):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "median: 4 guesses, mean: 4.09 ± 1.04, worst: 9, best: 2\n",
      "cumulative: ≤2:4%, ≤3:29%, ≤4:69%, ≤5:92%, ≤6:98%, ≤7:99.7%, ≤8:99.9%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 2.88 s, sys: 319 ms, total: 3.2 s\n",
      "Wall time: 1.6 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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SLfHvvTSS0ZoaKjbtUJDQ43KykrXWLdu3Ywbb7zRtV9RUWG0atXKeO+99wzDMIzCwkJDkpGRkeE65+effzY6duxozJ492zAMw3j22WeNIUOGuD13UVGRIck4cOCAYRiGERsba/Tp06fOnzc4ONiYNWuW29h1111nTJgwwbUfGRlpzJgxo8ZrOJ1Oo1mzZsY///lP19iJEyeMli1bGpMmTXKNSTJWrlzp9tiAgABj0aJFhmEYxltvvWV069bNqKqqch0vLy83fH19jfXr1xvHjh0zJBmbNm06bw4/Pz9j8eLF5z127733Gg8//LDb2JYtW4wmTZoYZ86cMVasWGH4+/sbTqezxp8T+KNhZga4BMyePVtLlizRvn37LvgaPXv2VJMm//9fCYGBgerVq5dr38fHR+3atVNJSYnb46Kjo11/btq0qaKiovTll19KknJzc/XJJ5+odevWru3qq6+W9Mv6lnOioqJqzeZ0OvXdd9+pf//+buP9+/d3PVd9HDp0SD///LOuv/5611hAQIC6detW72tIv/xcBw8elJ+fn+vnatu2rX766Sd9/fXXatu2rcaNG6ehQ4dq5MiRmj9/vo4ePep6fEpKih588EENGjRIGRkZbr+L3NxcLV682O13NnToUFVVVamwsFCDBw9WaGiorrzySt1777169913dfr0aY/yA5caygxwCRg4cKCGDh2qadOmVTvWpEkTGYbhNvbzzz9XO+/cbY5zbDbbeceqqqrqzHPudkpVVZVGjhypvLw8t62goMDt1kirVq3qvOavr3uOYRgevXPr3O/hfNf57fPU9jurqqpS3759q/1cX331lRITEyVJixYt0meffaaYmBgtX75c4eHh2r59u6Rf1jHt3btXI0aM0MaNG9WjRw+tXLnSde1HHnnE7bpffPGFCgoK1LVrV/n5+WnXrl1677335HA49Ne//lWRkZE6ceJEvX8PwKWGMgNcIjIyMvSvf/1L27Ztcxu//PLLVVxc7Pbi3JCfDXPuBVqSKioqlJub65p9ufbaa7V371517txZV111ldtW3wIjSf7+/goODtbWrVvdxrdt26bu3bvX+zpdu3ZVs2bNtGPHDteY0+l0rbs55/LLL3ebSSkoKHCb/bj22mtVUFCgDh06VPu5AgICXOddc801mjp1qrZt26aIiAgtXbrUdSw8PFxPPPGENmzYoISEBC1atMh17b1791a77lVXXaXmzZtL+mUGbNCgQZozZ4727Nmjw4cPa+PGjfX+PQCXGsoMcIno1auXxowZo5dfftltPC4uTv/3f/+nOXPm6Ouvv9Yrr7yitWvXNtjzvvLKK1q5cqX279+vpKQkHT9+XOPHj5ckJSUl6ccff9Q999yjHTt26NChQ9qwYYPGjx+vyspKj55n8uTJmj17tpYvX64DBw5oypQpysvL06RJk+p9DT8/P40dO1aTJ0/WJ598or1792r8+PFq0qSJ22zNzTffrMzMTO3atUs7d+7Uo48+6jZLNWbMGLVv316jRo3Sli1bVFhYqOzsbE2aNEnffPONCgsLNXXqVH322Wc6cuSINmzYoK+++krdu3fXmTNnNHHiRG3atElHjhzRp59+qpycHFcpe+aZZ/TZZ58pKSnJNYu1atUqPfbYY5Kkjz76SP/93/+tvLw8HTlyRG+//baqqqo8vlUGXEooM8Al5Pnnn692e6R79+569dVX9corrygyMlI7duyo8Z0+FyIjI0OzZ89WZGSktmzZog8//FDt27eXJAUHB+vTTz9VZWWlhg4dqoiICE2aNEkBAQFu63Pq4/HHH9eTTz6pJ598Ur169dK6deu0atUqhYWFeXSduXPnKjo6Wn/60580aNAg9e/fX927d1eLFi1c57z44osKCQnRwIEDlZiYqKeeekotW7Z0HW/ZsqU2b96sTp06KSEhQd27d9f48eN15swZ+fv7q2XLltq/f7/uuOMOhYeH6+GHH9bEiRP1yCOPyMfHR8eOHdN9992n8PBw3XXXXYqPj9dzzz0nSerdu7eys7NVUFCgG2+8Uddcc42effZZORwOSb+8Rfz999/XzTffrO7du+u1117Te++9p549e3r0ewAuJTbjt3/zAcAfyKlTp3TFFVfoxRdf1AMPPGB2HAAXoKnZAQDgYtq9e7f279+v66+/XqWlpZo5c6YkadSoUSYnA3ChKDMA/nD+9re/6cCBA2revLn69u2rLVu2uG6NAbAebjMBAABLYwEwAACwNMoMAACwNMoMAACwNMoMAACwNMoMAACwNMoMAACwNMoMAACwNMoMAACwtP8HSJY7kYjWoN8AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report(play(random_guesser, target=target, verbose=False) for target in wordlist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The random guesser strategy might have seemed hopelessly naive, but it is actually a pretty decent strategy, with mean number of guesses only about 15% worse than the best minimizing tree, and the same median number of guesses, 4. However, it does lose the game (by scoring more than 6) about 2% of the time."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reports on Inconsistent Wordle Guessers\n",
    "Now we'll report on trees with inconsistent guesses allowed. This will take double or triple as much time for each run."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the max of partition sizes over 2,309 targets; inconsistent guesses allowed\n",
      "first guess: \"ARISE\"\n",
      "median: 4 guesses, mean: 3.64 ± 0.66, worst: 6, best: 1\n",
      "cumulative: ≤2:2%, ≤3:42%, ≤4:93%, ≤5:99.5%, ≤6:100%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 6.35 s, sys: 229 ms, total: 6.58 s\n",
      "Wall time: 5.25 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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W2vu3LnauXOndu7cqdtuu00jR450FZa0tDTNnz9f6enpys7OVmBgoIYOHaqSkhJPYwMAgGuUx99mmjp1quLj43Xu3DlZlqUdO3bonXfeUWpqql5//XWPjjVixAi39Tlz5mjx4sXavn27unXrpgULFmjmzJmKjY2VJC1fvlwBAQFasWKFJkyY4Gl0AABwDfK4zDz44IMqKyvTtGnTdObMGcXFxalVq1ZauHCh7r333ssOUl5ernfffVenT59WeHi48vLyVFBQoOjoaNc+TqdTkZGRysrKumSZKS0tVWlpqWu9uLj4sjMBAADv51GZKSsr01//+leNGDFCjzzyiH744QdVVFSoZcuWlx1g3759Cg8P17lz59S4cWOtXr1a3bp1U1ZWliQpICDAbf+AgADX18EvJjU1Vc8+++xl5wEAAGbx6JqZevXq6Y9//KNr5uP666//TUVGkjp37qycnBxt375df/zjHzV27Fh9+eWXru0Oh8Ntf8uyKo392owZM1RUVORaLvyOFAAAuDZ5fJqpf//+2rNnj9q2bVsrARo0aOD6Tad+/fopOztbCxcu1FNPPSVJKigoUFBQkGv/wsLCSrM1v+Z0OuV0OmslGwAA8H4el5mJEydqypQp+uabb9S3b181atTIbXuvXr1+UyDLslRaWqr27dsrMDBQGRkZrq+Cnz9/XpmZmZo3b95veg4AAHDt8LjMjB49WpI0efJk15jD4XCd/rlwR+CaePrppxUTE6OQkBCVlJRo5cqV2rRpk9atWyeHw6HExESlpKQoNDRUoaGhSklJka+vr+Li4jyNDQAArlEel5m8vLxae/Lvv/9e999/v44fPy5/f3/16tVL69at09ChQyVJ06ZN09mzZzVx4kSdPHlS/fv314YNG+Tn51drGQAAgNk8LjO1da2MJL3xxhtVbnc4HEpOTlZycnKtPScAALi2eFxmJOmrr77SggULtH//fjkcDnXt2lUJCQnq2LFjbecDAACoksc/Z7B+/Xp169ZNO3bsUK9evdSjRw99/vnn6t69uzIyMq5ERgAAgEvyeGZm+vTpeuKJJzR37txK40899ZTrehcAAICrweOZmf379+uhhx6qND5+/Hi3m90BAABcDR6XmRYtWlz0V7NzcnJ+892AAQAAPOXxaaZHHnlEjz76qI4ePaqIiAg5HA5t3bpV8+bN05QpU65E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JEnNmjWzOUnNlZeXa+XKlTp9+rTCw8PtjlOt+Ph4DR8+XEOGDLE7So0dPnxYwcHBat++ve69914dPXrU7khVWrNmjfr166ff//73atmypfr06aPXXnvN7lgeOX/+vN5++22NHz/eq39cd+DAgfrHP/6hQ4cOSZK++OILbd26VXfeeafNyapWVlam8vJyNWzY0G3cx8dHW7dutSmVZ/Ly8lRQUKDo6GjXmNPpVGRkpLKysmxMdvm8/g7A8H6WZSkpKUkDBw5Ujx497I5TrX379ik8PFznzp1T48aNtXr1anXr1s3uWFVauXKldu/e7XXn5avSv39/vfnmm+rUqZO+//57Pf/884qIiFBubq6aN29ud7yLOnr0qBYvXqykpCQ9/fTT2rFjhyZPniyn06kHHnjA7ng18sEHH+jUqVMaN26c3VGq9NRTT6moqEhdunRR3bp1VV5erjlz5ui+++6zO1qV/Pz8FB4erueee05du3ZVQECA3nnnHX3++ecKDQ21O16NXPjx5n/9weaAgAAdO3bMjki/GWUGv9mkSZO0d+9eY/5V0rlzZ+Xk5OjUqVN67733NHbsWGVmZnptocnPz1dCQoI2bNhQ6V+D3iwmJsb13z179lR4eLg6duyo5cuXKykpycZkl1ZRUaF+/fopJSVFktSnTx/l5uZq8eLFxpSZN954QzExMQoODrY7SpVWrVqlt99+WytWrFD37t2Vk5OjxMREBQcHa+zYsXbHq9Jbb72l8ePHq1WrVqpbt65uvPFGxcXFaffu3XZH88i/ztxZluXVs3lVoczgN3n88ce1Zs0abd68Wa1bt7Y7To00aNBAN9xwgySpX79+ys7O1sKFC/Xqq6/anOzidu3apcLCQvXt29c1Vl5ers2bNys9PV2lpaWqW7eujQlrplGjRurZs6cOHz5sd5RLCgoKqlRqu3btqvfee8+mRJ45duyYPvnkE73//vt2R6nW1KlTNX36dN17772Sfim8x44dU2pqqteXmY4dOyozM1OnT59WcXGxgoKCNHr0aLVv397uaDVy4VuFBQUFCgoKco0XFhZWmq0xBdfM4LJYlqVJkybp/fff18aNG435Q3wxlmWptLTU7hiXdPvtt2vfvn3KyclxLf369dOYMWOUk5NjRJGRpNLSUu3fv9/tL09vM2DAgEq3GDh06JAxP2y7dOlStWzZUsOHD7c7SrXOnDmjOnXcP4Lq1q1rxFezL2jUqJGCgoJ08uRJrV+/XiNHjrQ7Uo20b99egYGBrm+9Sb9ca5WZmamIiAgbk10+Zma8wE8//aQjR4641vPy8pSTk6NmzZqpTZs2Nia7tPj4eK1YsUIffvih/Pz8XOdg/f395ePjY3O6S3v66acVExOjkJAQlZSUaOXKldq0aZPWrVtnd7RL8vPzq3QtUqNGjdS8eXOvvkbpySef1IgRI9SmTRsVFhbq+eefV3FxsVf/q/uJJ55QRESEUlJSNGrUKO3YsUNLlizRkiVL7I5WrYqKCi1dulRjx45VvXre/1f7iBEjNGfOHLVp00bdu3fXnj17NH/+fI0fP97uaNVav369LMtS586ddeTIEU2dOlWdO3fWgw8+aHc0l+o+VxITE5WSkqLQ0FCFhoYqJSVFvr6+iouLszH1b2Drd6lgWZZlffrpp5akSsvYsWPtjnZJF8sryVq6dKnd0ao0fvx4q23btlaDBg2sFi1aWLfffru1YcMGu2N5zISvZo8ePdoKCgqy6tevbwUHB1uxsbFWbm6u3bGq9be//c3q0aOH5XQ6rS5dulhLliyxO1KNrF+/3pJkHTx40O4oNVJcXGwlJCRYbdq0sRo2bGh16NDBmjlzplVaWmp3tGqtWrXK6tChg9WgQQMrMDDQio+Pt06dOmV3LDfVfa5UVFRYs2bNsgIDAy2n02kNHjzY2rdvn72hfwOHZVnWVW9QAAAAtYRrZgAAgNEoMwAAwGiUGQAAYDTKDAAAMBplBgAAGI0yAwAAjEaZAQAARqPMAAAAo1FmAFyWr7/+Wg6HQzk5OXZHcTlw4IBuueUWNWzYUL1797Y7DoCrhDIDGGrcuHFyOByaO3eu2/gHH3wgh8NhUyp7zZo1S40aNdLBgwf1j3/8w+44AK4SygxgsIYNG2revHk6efKk3VFqzfnz5y/7sV999ZUGDhyotm3bqnnz5rWYCoA3o8wABhsyZIgCAwOVmpp6yX2Sk5MrnXJZsGCB2rVr51ofN26c7r77bqWkpCggIEBNmzbVs88+q7KyMk2dOlXNmjVT69at9Ze//KXS8Q8cOKCIiAg1bNhQ3bt316ZNm9y2f/nll7rzzjvVuHFjBQQE6P7779cPP/zg2h4VFaVJkyYpKSlJ119/vYYOHXrR11FRUaHZs2erdevWcjqd6t27t9uvnTscDu3atUuzZ8+Ww+FQcnLyRY9TUlKiMWPGqFGjRgoKCtKLL76oqKgoJSYmuh3rgw8+cHtc06ZNtWzZMtf6t99+q9GjR+u6665T8+bNNXLkSH399deu7Zs2bdLNN9+sRo0aqWnTphowYICOHTsmSfriiy906623ys/PT02aNFHfvn21c+dO12OzsrI0ePBg+fj4KCQkRJMnT9bp06dd219++WWFhoaqYcOGCggI0H/+539e9LUC/y4oM4DB6tatq5SUFL300kv65ptvftOxNm7cqO+++06bN2/W/PnzlZycrN/97ne67rrr9Pnnn+uxxx7TY489pvz8fLfHTZ06VVOmTNGePXsUERGhu+66SydOnJAkHT9+XJGRkerdu7d27typdevW6fvvv9eoUaPcjrF8+XLVq1dP27Zt06uvvnrRfAsXLtQLL7ygP//5z9q7d6+GDRumu+66S4cPH3Y9V/fu3TVlyhQdP35cTz755EWPk5SUpG3btmnNmjXKyMjQli1btHv3bo/eqzNnzujWW29V48aNtXnzZm3dulWNGzfWHXfcofPnz6usrEx33323IiMjtXfvXn322Wd69NFHXaf/xowZo9atWys7O1u7du3S9OnTVb9+fUnSvn37NGzYMMXGxmrv3r1atWqVtm7dqkmTJkmSdu7cqcmTJ2v27Nk6ePCg1q1bp8GDB3uUH7jm2P2z3QAuz9ixY62RI0dalmVZt9xyizV+/HjLsixr9erV1q//aM+aNcsKCwtze+yLL75otW3b1u1Ybdu2tcrLy11jnTt3tgYNGuRaLysrsxo1amS98847lmVZVl5eniXJmjt3rmufn3/+2WrdurU1b948y7Is65lnnrGio6Pdnjs/P9+SZB08eNCyLMuKjIy0evfuXe3rDQ4OtubMmeM2dtNNN1kTJ050rYeFhVmzZs265DGKi4ut+vXrW++++65r7NSpU5avr6+VkJDgGpNkrV692u2x/v7+1tKlSy3Lsqw33njD6ty5s1VRUeHaXlpaavn4+Fjr16+3Tpw4YUmyNm3adNEcfn5+1rJlyy667f7777ceffRRt7EtW7ZYderUsc6ePWu99957VpMmTazi4uJLvk7g3w0zM8A1YN68eVq+fLm+/PLLyz5G9+7dVafO//9XQkBAgHr27Olar1u3rpo3b67CwkK3x4WHh7v+u169eurXr5/2798vSdq1a5c+/fRTNW7c2LV06dJF0i/Xt1zQr1+/KrMVFxfru+++04ABA9zGBwwY4Hqumjh69Kh+/vln3Xzzza4xf39/de7cucbHkH55XUeOHJGfn5/rdTVr1kznzp3TV199pWbNmmncuHEaNmyYRowYoYULF+r48eOuxyclJenhhx/WkCFDNHfuXLf3YteuXVq2bJnbezZs2DBVVFQoLy9PQ4cOVdu2bdWhQwfdf//9+utf/6ozZ854lB+41lBmgGvA4MGDNWzYMD399NOVttWpU0eWZbmN/fzzz5X2u3Ca4wKHw3HRsYqKimrzXDidUlFRoREjRignJ8dtOXz4sNupkUaNGlV7zF8f9wLLsjz65taF9+Fix/nX56nqPauoqFDfvn0rva5Dhw4pLi5OkrR06VJ99tlnioiI0KpVq9SpUydt375d0i/XMeXm5mr48OHauHGjunXrptWrV7uOPWHCBLfjfvHFFzp8+LA6duwoPz8/7d69W++8846CgoL03//93woLC9OpU6dq/D4A1xrKDHCNmDt3rv72t78pKyvLbbxFixYqKChw+3CuzXvDXPiAlqSysjLt2rXLNfty4403Kjc3V+3atdMNN9zgttS0wEhSkyZNFBwcrK1bt7qNZ2VlqWvXrjU+TseOHVW/fn3t2LHDNVZcXOy67uaCFi1auM2kHD582G3248Ybb9Thw4fVsmXLSq/L39/ftV+fPn00Y8YMZWVlqUePHlqxYoVrW6dOnfTEE09ow4YNio2N1dKlS13Hzs3NrXTcG264QQ0aNJD0ywzYkCFDlJaWpr179+rrr7/Wxo0ba/w+ANcaygxwjejZs6fGjBmjl156yW08KipK//d//6e0tDR99dVXWrRokdauXVtrz7to0SKtXr1aBw4cUHx8vE6ePKnx48dLkuLj4/Xjjz/qvvvu044dO3T06FFt2LBB48ePV3l5uUfPM3XqVM2bN0+rVq3SwYMHNX36dOXk5CghIaHGx/Dz89PYsWM1depUffrpp8rNzdX48eNVp04dt9ma2267Tenp6dq9e7d27typxx57zG2WasyYMbr++us1cuRIbdmyRXl5ecrMzFRCQoK++eYb5eXlacaMGfrss8907NgxbdiwQYcOHVLXrl119uxZTZo0SZs2bdKxY8e0bds2ZWdnu0rZU089pc8++0zx8fGuWaw1a9bo8ccflyR99NFH+p//+R/l5OTo2LFjevPNN1VRUeHxqTLgWkKZAa4hzz33XKXTI127dtXLL7+sRYsWKSwsTDt27LjkN30ux9y5czVv3jyFhYVpy5Yt+vDDD3X99ddLkoKDg7Vt2zaVl5dr2LBh6tGjhxISEuTv7+92fU5NTJ48WVOmTNGUKVPUs2dPrVu3TmvWrFFoaKhHx5k/f77Cw8P1u9/9TkOGDNGAAQPUtWtXNWzY0LXPCy+8oJCQEA0ePFhxcXF68skn5evr69ru6+urzZs3q02bNoqNjVXXrl01fvx4nT17Vk2aNJGvr68OHDige+65R506ddKjjz6qSZMmacKECapbt65OnDihBx54QJ06ddKoUaMUExOjZ599VpLUq1cvZWZm6vDhwxo0aJD69OmjZ555RkFBQZJ++Yr4+++/r9tuu01du3bVK6+8onfeeUfdu3f36H0AriUO61//5gOAfyOnT59Wq1at9MILL+ihhx6yOw6Ay1DP7gAAcDXt2bNHBw4c0M0336yioiLNnj1bkjRy5EibkwG4XJQZAP92/vznP+vgwYNq0KCB+vbtqy1btrhOjQEwD6eZAACA0bgAGAAAGI0yAwAAjEaZAQAARqPMAAAAo1FmAACA0SgzAADAaJQZAABgNMoMAAAw2v8D+X+dd9BkVzgAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(max, inconsistent=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the expectation of partition sizes over 2,309 targets; inconsistent guesses allowed\n",
      "first guess: \"RAISE\"\n",
      "median: 4 guesses, mean: 3.55 ± 0.64, worst: 6, best: 1\n",
      "cumulative: ≤2:2%, ≤3:48%, ≤4:95%, ≤5:99.6%, ≤6:100%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 7.14 s, sys: 223 ms, total: 7.36 s\n",
      "Wall time: 5.51 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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7Wo1adLECg4OthITE63jx4/bHctNXb9XqqurrVmzZlnBwcGW0+m0hgwZYu3atcve0BfBYVmWddkbFAAAQAPhnhkAAGA0ygwAADAaZQYAABiNMgMAAIxGmQEAAEajzAAAAKNRZgAAgNEoMwAAwGiUGQAX5NChQ3I4HCooKLA7isuePXt00003qWnTpurXr5/dcQBcJpQZwFATJ06Uw+FQRkaG2/g777wjh8NhUyp7zZo1S82aNdPevXv1j3/8w+44AC4TygxgsKZNm2ru3Lk6duyY3VEazJkzZy74tZ9//rkGDx6sTp06KTAwsAFTAfBmlBnAYEOHDlVwcLDS09PPu09qamqNSy4LFixQ586dXesTJ07UnXfeqbS0NAUFBally5Z66qmnVFlZqWnTpqlVq1Zq3769/vznP9c4/p49exQVFaWmTZuqT58+2rBhg9v23bt3a+TIkWrevLmCgoJ0991365tvvnFtj4mJ0eTJk5WSkqLWrVtr2LBh5/w5qqurNXv2bLVv315Op1P9+vVz+7Zzh8Oh/Px8zZ49Ww6HQ6mpqec8Tnl5ucaPH69mzZqpbdu2eu655xQTE6Pk5GS3Y73zzjtur2vZsqVef/111/qXX36pcePG6eqrr1ZgYKDGjBmjQ4cOubZv2LBBN954o5o1a6aWLVtq0KBBOnz4sCTp008/1S233CJ/f3+1aNFCAwYM0LZt21yvzc3N1ZAhQ+Tr66sOHTpoypQpOnnypGv7iy++qNDQUDVt2lRBQUH6j//4j3P+rMDPBWUGMFijRo2Ulpam559/Xl988cVFHWv9+vX66quvtHHjRs2fP1+pqan6xS9+oauvvlqffPKJHnroIT300EMqLi52e920adM0depU7dixQ1FRUbrjjjt09OhRSdKRI0cUHR2tfv36adu2bVq7dq2+/vprjR071u0YS5culY+Pj7Zs2aKXX375nPkWLlyoZ599Vn/84x+1c+dODR8+XHfccYf279/vOlefPn00depUHTlyRI8++ug5j5OSkqItW7Zo9erVys7O1qZNm7R9+3aP3qtTp07plltuUfPmzbVx40Zt3rxZzZs31+23364zZ86osrJSd955p6Kjo7Vz50599NFHeuCBB1yX/8aPH6/27dsrLy9P+fn5mj59uho3bixJ2rVrl4YPH664uDjt3LlTK1eu1ObNmzV58mRJ0rZt2zRlyhTNnj1be/fu1dq1azVkyBCP8gNXHLu/thvAhZkwYYI1ZswYy7Is66abbrISEhIsy7KsVatWWT/9oz1r1iwrPDzc7bXPPfec1alTJ7djderUyaqqqnKN9ejRw7r55ptd65WVlVazZs2s5cuXW5ZlWUVFRZYkKyMjw7XPDz/8YLVv396aO3euZVmW9eSTT1qxsbFu5y4uLrYkWXv37rUsy7Kio6Otfv361fnzhoSEWHPmzHEbu+GGG6xJkya51sPDw61Zs2ad9xhlZWVW48aNrb/97W+usePHj1t+fn5WUlKSa0yStWrVKrfXBgQEWEuWLLEsy7Jee+01q0ePHlZ1dbVre0VFheXr62utW7fOOnr0qCXJ2rBhwzlz+Pv7W6+//vo5t919993WAw884Da2adMm66qrrrJOnz5tvfXWW1aLFi2ssrKy8/6cwM8NMzPAFWDu3LlaunSpdu/efcHH6NOnj6666v//lRAUFKTrrrvOtd6oUSMFBgaqtLTU7XWRkZGu//bx8VFERIQ+++wzSVJ+fr4+/PBDNW/e3LX07NlT0o/3t5wVERFRa7aysjJ99dVXGjRokNv4oEGDXOeqj4MHD+qHH37QjTfe6BoLCAhQjx496n0M6cef68CBA/L393f9XK1atdL333+vzz//XK1atdLEiRM1fPhwjR49WgsXLtSRI0dcr09JSdF9992noUOHKiMjw+29yM/P1+uvv+72ng0fPlzV1dUqKirSsGHD1KlTJ3Xt2lV33323/vrXv+rUqVMe5QeuNJQZ4AowZMgQDR8+XE888USNbVdddZUsy3Ib++GHH2rsd/Yyx1kOh+OcY9XV1XXmOXs5pbq6WqNHj1ZBQYHbsn//frdLI82aNavzmD897lmWZXn05NbZ9+Fcx/n389T2nlVXV2vAgAE1fq59+/YpPj5ekrRkyRJ99NFHioqK0sqVK9W9e3d9/PHHkn68j6mwsFCjRo3S+vXr1bt3b61atcp17AcffNDtuJ9++qn279+vbt26yd/fX9u3b9fy5cvVtm1b/dd//ZfCw8N1/Pjxer8PwJWGMgNcITIyMvT3v/9dubm5buPXXHONSkpK3H45N+Rnw5z9BS1JlZWVys/Pd82+XH/99SosLFTnzp117bXXui31LTCS1KJFC4WEhGjz5s1u47m5uerVq1e9j9OtWzc1btxYW7dudY2VlZW57rs565prrnGbSdm/f7/b7Mf111+v/fv3q02bNjV+roCAANd+/fv314wZM5Sbm6uwsDAtW7bMta179+565JFHlJWVpbi4OC1ZssR17MLCwhrHvfbaa9WkSRNJP86ADR06VPPmzdPOnTt16NAhrV+/vt7vA3ClocwAV4jrrrtO48eP1/PPP+82HhMTo//7v//TvHnz9Pnnn+uFF17QmjVrGuy8L7zwglatWqU9e/YoMTFRx44dU0JCgiQpMTFR3377rX7zm99o69atOnjwoLKyspSQkKCqqiqPzjNt2jTNnTtXK1eu1N69ezV9+nQVFBQoKSmp3sfw9/fXhAkTNG3aNH344YcqLCxUQkKCrrrqKrfZmltvvVWZmZnavn27tm3bpoceeshtlmr8+PFq3bq1xowZo02bNqmoqEg5OTlKSkrSF198oaKiIs2YMUMfffSRDh8+rKysLO3bt0+9evXS6dOnNXnyZG3YsEGHDx/Wli1blJeX5ypljz/+uD766CMlJia6ZrFWr16thx9+WJL03nvv6U9/+pMKCgp0+PBh/eUvf1F1dbXHl8qAKwllBriCPP300zUuj/Tq1UsvvviiXnjhBYWHh2vr1q3nfdLnQmRkZGju3LkKDw/Xpk2b9O6776p169aSpJCQEG3ZskVVVVUaPny4wsLClJSUpICAALf7c+pjypQpmjp1qqZOnarrrrtOa9eu1erVqxUaGurRcebPn6/IyEj94he/0NChQzVo0CD16tVLTZs2de3z7LPPqkOHDhoyZIji4+P16KOPys/Pz7Xdz89PGzduVMeOHRUXF6devXopISFBp0+fVosWLeTn56c9e/boV7/6lbp3764HHnhAkydP1oMPPqhGjRrp6NGjuueee9S9e3eNHTtWI0aM0FNPPSVJ6tu3r3JycrR//37dfPPN6t+/v5588km1bdtW0o+PiL/99tu69dZb1atXL7300ktavny5+vTp49H7AFxJHNa//80HAD8jJ0+eVLt27fTss8/q3nvvtTsOgAvgY3cAALicduzYoT179ujGG2/UiRMnNHv2bEnSmDFjbE4G4EJRZgD87Pzxj3/U3r171aRJEw0YMECbNm1yXRoDYB4uMwEAAKNxAzAAADAaZQYAABiNMgMAAIxGmQEAAEajzAAAAKNRZgAAgNEoMwAAwGiUGQAAYLT/BxFt5YK1eCMpAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(expectation, inconsistent=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the neg_entropy of partition sizes over 2,309 targets; inconsistent guesses allowed\n",
      "first guess: \"RAISE\"\n",
      "median: 3 guesses, mean: 3.52 ± 0.64, worst: 6, best: 1\n",
      "cumulative: ≤2:2%, ≤3:50%, ≤4:95%, ≤5:99.6%, ≤6:100%, ≤7:100%, ≤8:100%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 6.88 s, sys: 234 ms, total: 7.11 s\n",
      "Wall time: 5.72 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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3qFDB/3444/VEgoAAKCqPC4zERERSktLqzCelpamiIiIagkFAABQVR6fZkpNTdWgQYP0xRdfqFevXnI4HMrMzFReXp4+//zza5ERAADgsjyemYmKitLBgwf1H//xHzp9+rR+/PFHxcbG6sCBA7rzzjuvRUYAAIDL8nhmRpKCg4O50BcAAHgFj2dmAAAAvAllBgAAGI0yAwAAjEaZAQAARruqC4AvOnHihLZu3aqysjLddtttCgoKqq5cAAAAVXLVZeajjz7S448/rnbt2umXX37RgQMHNH/+fD322GPVmQ8AAOCKqnya6aeffnJbnzZtmrZt26Zt27Zp586d+vDDDzVlypRqDwgAAHAlVS4z3bt316effupar1WrlgoKClzrP/zwg+rUqVO96QAAACpR5dNMa9as0ejRo7V48WLNnz9f8+bN07Bhw1RWVqbS0lLVqFFDixcvvoZRAQAAKqpymWndurU+//xzLV26VFFRURo3bpwOHz6sw4cPq6ysTB06dFDdunWvZVYAAIAKPP5qdlxcnOs6mejoaJWXl6tr165XVWRSUlJ02223yc/PT02bNtUDDzygAwcOuO1jWZaSkpIUHBwsHx8fRUdHa8+ePR4/FwAAuDF5VGZWrVql2bNnKzs7W++8845mzZqluLg4TZgwQefOnfP4yTMyMhQfH68tW7YoPT1dpaWliomJ0ZkzZ1z7pKamas6cOUpLS1NWVpYCAwPVv39/FRcXe/x8AADgxlPlMjNx4kSNHDlSWVlZevrpp/Xyyy8rOjpaO3fulNPpVNeuXbVq1SqPnnz16tUaOXKkwsLCFBERoUWLFumf//ynsrOzJV2YlZk7d66mTJmi2NhYhYeHa8mSJTp79qyWLl3q2SsFAAA3pCqXmT//+c/6/PPP9cEHHygrK0vvvfeeJKlOnTp65ZVX9PHHH//mX9IuLCyUJDVq1EiSlJubq/z8fMXExLj2cTqdioqKUmZm5iWPUVJSoqKiIrcFAADcuKpcZnx9fZWbmytJysvLq3CNTFhYmDZt2nTVQSzLUmJiovr06aPw8HBJUn5+viQpICDAbd+AgADXtn+VkpIif39/19KiRYurzgQAALxflctMSkqKHn30UQUHBysqKkovv/xytQYZM2aMdu3apWXLllXY5nA43NYty6owdtHkyZNVWFjoWvLy8qo1JwAA8C5V/mr2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jjp37pzGjBmj9evX69ixY9q8ebOysrJcpeyFF17QV199pfj4eNcs1sqVK/Xss89Kkj777DP9z//8j3JycnTs2DG9++67Ki8v9/hUGXAjocwAN5CXX365wumRjh076vXXX9f8+fMVERGhbdu2XfabPldj5syZmjVrliIiIrRx40Z9+umnuvnmmyVJwcHB2rx5s8rKyjRgwACFh4dr3Lhx8vf3d7s+pyrGjh2r8ePHa/z48ercubNWr16tlStXKjQ01KPjzJkzR7169dLvfvc79evXT71791bHjh1Vt25d1z6zZ89WixYt1LdvX8XFxen555+Xr6+va7uvr682bNigli1bKjY2Vh07dtSoUaN07tw5NWjQQL6+vtq/f78efPBBtWvXTk899ZTGjBmjp59+WjVr1tTJkyf16KOPql27dho6dKgGDhyoadOmSZK6dOmijIwMHTp0SHfeeae6deuml156SUFBQZIufEX8448/1t13362OHTvqjTfe0LJlyxQWFubR+wDcSBzWv/7LBwD/Rs6cOaNmzZpp9uzZevzxx+2OA+Aq1LI7AABcTzt37tT+/ft1++23q7CwUNOnT5ckDRkyxOZkAK4WZQbAv50//elPOnDggOrUqaPu3btr48aNrlNjAMzDaSYAAGA0LgAGAABGo8wAAACjUWYAAIDRKDMAAMBolBkAAGA0ygwAADAaZQYAABiNMgMAAIz2/wFx0MPkfS3jmAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(neg_entropy, inconsistent=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Mission accomplished!** With inconsistent guesses allowed, all three metrics  solve  100% of the target words in 6 guesses or less. Again, `neg_entropy` is the best metric by a small amount, giving a mean of 3.52 guesses.\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Best and Worst First Guesses\n",
    "\n",
    "Below we create a table of the best and worst first guesses (that is, the guesses that score the highest and lowest  according to each of the three metrics):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "\n",
    "def first_guesses(targets) -> pd.DataFrame: \n",
    "    \"\"\"A data frame of words and scores on the 3 metrics, sorted best to worst on each metric.\"\"\"\n",
    "    metrics = (max, expectation, neg_entropy)\n",
    "    data = [sorted((metric(partition_counts(g, targets)), g) for g in wordlist)\n",
    "            for metric in metrics]\n",
    "    def reformat(row):\n",
    "        (val1, word1), (val2, word2), (val3, word3) = row\n",
    "        return [word1, val1, word2, round(val2, 2), word3, round(val3, 3)]\n",
    "    return pd.DataFrame(map(reformat, zip(*data)), \n",
    "                        columns='max_word max_score exp_word exp_score ent_word ent_score'.split())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The best and worst first guesses for Wordle:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>max_word</th>\n",
       "      <th>max_score</th>\n",
       "      <th>exp_word</th>\n",
       "      <th>exp_score</th>\n",
       "      <th>ent_word</th>\n",
       "      <th>ent_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ARISE</td>\n",
       "      <td>167</td>\n",
       "      <td>RAISE</td>\n",
       "      <td>60.74</td>\n",
       "      <td>RAISE</td>\n",
       "      <td>-5.878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>RAISE</td>\n",
       "      <td>167</td>\n",
       "      <td>ARISE</td>\n",
       "      <td>63.47</td>\n",
       "      <td>SLATE</td>\n",
       "      <td>-5.856</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ALONE</td>\n",
       "      <td>182</td>\n",
       "      <td>IRATE</td>\n",
       "      <td>63.49</td>\n",
       "      <td>CRATE</td>\n",
       "      <td>-5.835</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>AROSE</td>\n",
       "      <td>182</td>\n",
       "      <td>AROSE</td>\n",
       "      <td>65.76</td>\n",
       "      <td>IRATE</td>\n",
       "      <td>-5.833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>RATIO</td>\n",
       "      <td>190</td>\n",
       "      <td>ALTER</td>\n",
       "      <td>69.83</td>\n",
       "      <td>TRACE</td>\n",
       "      <td>-5.830</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2304</th>\n",
       "      <td>CIVIC</td>\n",
       "      <td>1247</td>\n",
       "      <td>PUPPY</td>\n",
       "      <td>775.34</td>\n",
       "      <td>FIZZY</td>\n",
       "      <td>-2.506</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2305</th>\n",
       "      <td>PUPPY</td>\n",
       "      <td>1283</td>\n",
       "      <td>MAMMA</td>\n",
       "      <td>776.30</td>\n",
       "      <td>MUMMY</td>\n",
       "      <td>-2.480</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2306</th>\n",
       "      <td>MUMMY</td>\n",
       "      <td>1321</td>\n",
       "      <td>VIVID</td>\n",
       "      <td>812.76</td>\n",
       "      <td>MAMMA</td>\n",
       "      <td>-2.398</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2307</th>\n",
       "      <td>VIVID</td>\n",
       "      <td>1324</td>\n",
       "      <td>MUMMY</td>\n",
       "      <td>817.96</td>\n",
       "      <td>JAZZY</td>\n",
       "      <td>-2.309</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2308</th>\n",
       "      <td>FUZZY</td>\n",
       "      <td>1349</td>\n",
       "      <td>FUZZY</td>\n",
       "      <td>854.18</td>\n",
       "      <td>FUZZY</td>\n",
       "      <td>-2.304</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2309 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     max_word  max_score exp_word  exp_score ent_word  ent_score\n",
       "0       ARISE        167    RAISE      60.74    RAISE     -5.878\n",
       "1       RAISE        167    ARISE      63.47    SLATE     -5.856\n",
       "2       ALONE        182    IRATE      63.49    CRATE     -5.835\n",
       "3       AROSE        182    AROSE      65.76    IRATE     -5.833\n",
       "4       RATIO        190    ALTER      69.83    TRACE     -5.830\n",
       "...       ...        ...      ...        ...      ...        ...\n",
       "2304    CIVIC       1247    PUPPY     775.34    FIZZY     -2.506\n",
       "2305    PUPPY       1283    MAMMA     776.30    MUMMY     -2.480\n",
       "2306    MUMMY       1321    VIVID     812.76    MAMMA     -2.398\n",
       "2307    VIVID       1324    MUMMY     817.96    JAZZY     -2.309\n",
       "2308    FUZZY       1349    FUZZY     854.18    FUZZY     -2.304\n",
       "\n",
       "[2309 rows x 6 columns]"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df = first_guesses(wordlist)\n",
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The top guesses are `\"RAISE\"` and its anagram `\"ARISE\"`. The letters `'A'`, `'R'`, and `'E'` are the most common in the top guesses. The three metrics agree that `'FUZZY'` is the worst first guess.\n",
    "\n",
    "Here are the top 20 words for each metric:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>max_word</th>\n",
       "      <th>max_score</th>\n",
       "      <th>exp_word</th>\n",
       "      <th>exp_score</th>\n",
       "      <th>ent_word</th>\n",
       "      <th>ent_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ARISE</td>\n",
       "      <td>167</td>\n",
       "      <td>RAISE</td>\n",
       "      <td>60.74</td>\n",
       "      <td>RAISE</td>\n",
       "      <td>-5.878</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>RAISE</td>\n",
       "      <td>167</td>\n",
       "      <td>ARISE</td>\n",
       "      <td>63.47</td>\n",
       "      <td>SLATE</td>\n",
       "      <td>-5.856</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>ALONE</td>\n",
       "      <td>182</td>\n",
       "      <td>IRATE</td>\n",
       "      <td>63.49</td>\n",
       "      <td>CRATE</td>\n",
       "      <td>-5.835</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>AROSE</td>\n",
       "      <td>182</td>\n",
       "      <td>AROSE</td>\n",
       "      <td>65.76</td>\n",
       "      <td>IRATE</td>\n",
       "      <td>-5.833</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>RATIO</td>\n",
       "      <td>190</td>\n",
       "      <td>ALTER</td>\n",
       "      <td>69.83</td>\n",
       "      <td>TRACE</td>\n",
       "      <td>-5.830</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>ATONE</td>\n",
       "      <td>191</td>\n",
       "      <td>SANER</td>\n",
       "      <td>70.02</td>\n",
       "      <td>ARISE</td>\n",
       "      <td>-5.821</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>IRATE</td>\n",
       "      <td>193</td>\n",
       "      <td>LATER</td>\n",
       "      <td>70.03</td>\n",
       "      <td>STARE</td>\n",
       "      <td>-5.807</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>AISLE</td>\n",
       "      <td>196</td>\n",
       "      <td>SNARE</td>\n",
       "      <td>71.02</td>\n",
       "      <td>SNARE</td>\n",
       "      <td>-5.769</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>ALERT</td>\n",
       "      <td>196</td>\n",
       "      <td>STARE</td>\n",
       "      <td>71.05</td>\n",
       "      <td>AROSE</td>\n",
       "      <td>-5.768</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>ALTER</td>\n",
       "      <td>196</td>\n",
       "      <td>SLATE</td>\n",
       "      <td>71.28</td>\n",
       "      <td>LEAST</td>\n",
       "      <td>-5.752</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>LATER</td>\n",
       "      <td>196</td>\n",
       "      <td>ALERT</td>\n",
       "      <td>71.51</td>\n",
       "      <td>ALERT</td>\n",
       "      <td>-5.744</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>11</th>\n",
       "      <td>TEARY</td>\n",
       "      <td>198</td>\n",
       "      <td>CRATE</td>\n",
       "      <td>72.81</td>\n",
       "      <td>CRANE</td>\n",
       "      <td>-5.741</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>LEANT</td>\n",
       "      <td>207</td>\n",
       "      <td>TRACE</td>\n",
       "      <td>73.95</td>\n",
       "      <td>STALE</td>\n",
       "      <td>-5.738</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>LEARN</td>\n",
       "      <td>212</td>\n",
       "      <td>STALE</td>\n",
       "      <td>75.33</td>\n",
       "      <td>SANER</td>\n",
       "      <td>-5.734</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>14</th>\n",
       "      <td>RENAL</td>\n",
       "      <td>212</td>\n",
       "      <td>AISLE</td>\n",
       "      <td>76.09</td>\n",
       "      <td>ALTER</td>\n",
       "      <td>-5.713</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>15</th>\n",
       "      <td>EARLY</td>\n",
       "      <td>215</td>\n",
       "      <td>LEARN</td>\n",
       "      <td>76.72</td>\n",
       "      <td>LATER</td>\n",
       "      <td>-5.707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>LAYER</td>\n",
       "      <td>215</td>\n",
       "      <td>LEANT</td>\n",
       "      <td>77.09</td>\n",
       "      <td>REACT</td>\n",
       "      <td>-5.697</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>17</th>\n",
       "      <td>LOSER</td>\n",
       "      <td>215</td>\n",
       "      <td>ALONE</td>\n",
       "      <td>77.16</td>\n",
       "      <td>TRADE</td>\n",
       "      <td>-5.684</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>18</th>\n",
       "      <td>RELAY</td>\n",
       "      <td>215</td>\n",
       "      <td>LEAST</td>\n",
       "      <td>77.97</td>\n",
       "      <td>LEANT</td>\n",
       "      <td>-5.684</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>19</th>\n",
       "      <td>CANOE</td>\n",
       "      <td>216</td>\n",
       "      <td>CRANE</td>\n",
       "      <td>78.69</td>\n",
       "      <td>LEARN</td>\n",
       "      <td>-5.652</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   max_word  max_score exp_word  exp_score ent_word  ent_score\n",
       "0     ARISE        167    RAISE      60.74    RAISE     -5.878\n",
       "1     RAISE        167    ARISE      63.47    SLATE     -5.856\n",
       "2     ALONE        182    IRATE      63.49    CRATE     -5.835\n",
       "3     AROSE        182    AROSE      65.76    IRATE     -5.833\n",
       "4     RATIO        190    ALTER      69.83    TRACE     -5.830\n",
       "5     ATONE        191    SANER      70.02    ARISE     -5.821\n",
       "6     IRATE        193    LATER      70.03    STARE     -5.807\n",
       "7     AISLE        196    SNARE      71.02    SNARE     -5.769\n",
       "8     ALERT        196    STARE      71.05    AROSE     -5.768\n",
       "9     ALTER        196    SLATE      71.28    LEAST     -5.752\n",
       "10    LATER        196    ALERT      71.51    ALERT     -5.744\n",
       "11    TEARY        198    CRATE      72.81    CRANE     -5.741\n",
       "12    LEANT        207    TRACE      73.95    STALE     -5.738\n",
       "13    LEARN        212    STALE      75.33    SANER     -5.734\n",
       "14    RENAL        212    AISLE      76.09    ALTER     -5.713\n",
       "15    EARLY        215    LEARN      76.72    LATER     -5.707\n",
       "16    LAYER        215    LEANT      77.09    REACT     -5.697\n",
       "17    LOSER        215    ALONE      77.16    TRADE     -5.684\n",
       "18    RELAY        215    LEAST      77.97    LEANT     -5.684\n",
       "19    CANOE        216    CRANE      78.69    LEARN     -5.652"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df[:20]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see below that partitioning with the guess`'RAISE'` will leave us with no more than 167 words in any branch, while `'FUZZY'` is likely to leave us with a branch of 1349 words, and about 80% of the time will leave us with a branch of 228 words or more."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({1: 28,\n",
       "         2: 13,\n",
       "         3: 5,\n",
       "         4: 10,\n",
       "         5: 8,\n",
       "         6: 4,\n",
       "         7: 3,\n",
       "         8: 4,\n",
       "         9: 4,\n",
       "         10: 2,\n",
       "         12: 3,\n",
       "         13: 2,\n",
       "         14: 1,\n",
       "         15: 2,\n",
       "         17: 3,\n",
       "         18: 2,\n",
       "         19: 1,\n",
       "         20: 4,\n",
       "         21: 2,\n",
       "         22: 1,\n",
       "         23: 2,\n",
       "         24: 1,\n",
       "         25: 1,\n",
       "         26: 4,\n",
       "         28: 2,\n",
       "         29: 1,\n",
       "         34: 2,\n",
       "         35: 1,\n",
       "         40: 1,\n",
       "         41: 2,\n",
       "         43: 1,\n",
       "         51: 1,\n",
       "         61: 1,\n",
       "         69: 1,\n",
       "         77: 1,\n",
       "         80: 1,\n",
       "         91: 2,\n",
       "         102: 1,\n",
       "         103: 1,\n",
       "         107: 1,\n",
       "         120: 1,\n",
       "         167: 1})"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Counter(partition_counts('RAISE', wordlist))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Counter({1: 12,\n",
       "         2: 2,\n",
       "         3: 1,\n",
       "         4: 2,\n",
       "         5: 2,\n",
       "         6: 1,\n",
       "         7: 1,\n",
       "         8: 1,\n",
       "         10: 2,\n",
       "         16: 1,\n",
       "         20: 1,\n",
       "         45: 1,\n",
       "         51: 2,\n",
       "         84: 1,\n",
       "         122: 1,\n",
       "         228: 1,\n",
       "         265: 1,\n",
       "         1349: 1})"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Counter(partition_counts('FUZZY', wordlist))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Evil Wordle\n",
    "\n",
    "The [**Evil Wordle**](https://swag.github.io/evil-wordle/) variant says it works like this: *\"There's no [target] word set by default. Every time you guess, I look at all possible 5-letter words that would fit all your guesses, and choose the match pattern [reply] that results in the most possible words. My goal is to maximize the amount of guesses it takes to find the word.\"*\n",
    "\n",
    "To play against Evil Wordle, minimizing the max branch size is a good strategy. We know the guess tree that minimizes max has a few branches that require 6 guesses. If the Evil Replier did look-ahead, perhaps they could force us to one of those branches. But we know that the Evil Replier greedily picks the branch with the \"most possible words.\" So I will define `evil` to follow branches through a guess tree and produce the (guess, reply) pairs along the way. For a given tree, there is only one possible game (assuming the Evil Replier breaks ties the same way each time)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [],
   "source": [
    "def evil(tree) -> List[Tuple[Word, Reply]]:\n",
    "    \"\"\"Given a guess tree, determine what happens when the Evil Replier always picks a maximum-sized branch.\n",
    "    The result is a list of (guess, reply) tuples.\"\"\"\n",
    "    if isinstance(tree, Word):\n",
    "        return [(tree, Correct)]\n",
    "    else:\n",
    "        def size(reply): \n",
    "            branch = tree.branches[reply]\n",
    "            return 0 if reply == Correct else 1 if isinstance(branch, Word) else branch.size\n",
    "        reply = max(tree.branches, key=size)\n",
    "        return [(tree.guess, reply)] + evil(tree.branches[reply])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('ARISE', '.....'),\n",
       " ('BLOND', '.....'),\n",
       " ('DUMPY', '.YYY.'),\n",
       " ('CHUMP', '.GGGG'),\n",
       " ('THUMP', 'GGGGG')]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "evil(minimizing_tree(max, wordlist, inconsistent=True))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that the one possible game consists of 5 guesses. That raises two questions:\n",
    "- Would it be possible for a smarter Guesser to create a different tree (perhaps minimizing something other than max) that only requires 4 guesses? **No.** I know that because (a) when there are two words left in a branch, it will always take two guesses to defeat the Evil Replier, and (b) I previously tried all two-word guess pairs to see which resulted in the smallest branches, and every pair had branches with multiple words.\n",
    "- Would it be possible for a smarter Evil Replier to force a game with 6 guesses? **Maybe.** We know the minimizing-max guess tree has 11 out of 2,309 leaves that require 6 guesses. If the Evil Replier did look-ahead instead of acting greedily, could it get to one of those? I think it is unlikely, but I would need to do a minimax search to prove it one way or the other.\n",
    "\n",
    "Alas, this is all moot, because a little experimenting shows that [**Evil Wordle**](https://swag.github.io/evil-wordle/) is using a word list that contains multiple words that are not in the 2,309 word list. I suspect it is using Wordle's complete 12,971–word list."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Antiwordle\n",
    "\n",
    "The Wordle variant [**Antiwordle**](https://www.antiwordle.com/) invites you to *\"Avoid guessing the hidden word in as many tries as possible. Sounds easy, but there's a catch!*\"  The catch is that only consistent guesses are allowed. We can solve Antiwordle by minimizing the entropy (not negative entropy!) of branch sizes. That is, we want big branches."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the entropy of partition sizes over 2,309 targets; inconsistent guesses prohibited\n",
      "first guess: \"FUZZY\"\n",
      "median: 6 guesses, mean: 5.75 ± 1.61, worst: 11, best: 1\n",
      "cumulative: ≤2:1%, ≤3:8%, ≤4:23%, ≤5:44%, ≤6:68%, ≤7:87%, ≤8:96%, ≤9:99%, ≤10:99.7%\n"
     ]
    },
    {
     "data": {
      "image/png": "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6FC3YyxZskTVq1fXli1b9Prrr18238svv6y5c+fqb3/7m/bu3asBAwbo7rvvVlZWluu52rdvr4kTJ+rEiROaNGnSZY8THx+vLVu2aNWqVUpLS9OmTZu0e/duj16r8+fPq2/fvqpXr542btyozZs3q169errzzjt18eJFFRUVaciQIYqKitLevXu1bds2Pf74467TfyNGjFCzZs20c+dOZWRkaMqUKapRo4Ykad++fRowYIBiY2O1d+9eLVu2TJs3b9bYsWMlSbt27dK4ceM0Y8YMHTp0SGvWrFHv3r09yg9cd+z+2m4AV2fkyJHW4MGDLcuyrG7dulmjR4+2LMuyli9fbv36j/b06dOtiIgIt8e+9NJLVkhIiNuxQkJCrOLiYtdY69atrV69ernWi4qKrLp161rvvfeeZVmWlZ2dbUmykpOTXfv8/PPPVrNmzazZs2dblmVZzz//vBUdHe323Dk5OZYk69ChQ5ZlWVZUVJTVsWPHcn/foKAga9asWW5jt912mzVmzBjXekREhDV9+vQrHiM/P9+qUaOG9c9//tM1dubMGatOnTrW+PHjXWOSrOXLl7s91s/Pz0pNTbUsy7Leeustq3Xr1lZJSYlre2FhoVW7dm1r7dq11qlTpyxJ1oYNGy6bw9fX11q8ePFltz344IPW448/7ja2adMmq1q1ataFCxesDz74wKpfv76Vn59/xd8T+KNhZga4DsyePVtLlizRl19+edXHaN++vapV+///SvD391eHDh1c6z4+PmrUqJFyc3PdHte9e3fXz9WrV1eXLl104MABSVJGRoY+++wz1atXz7W0adNG0i/Xt1zSpUuXMrPl5+fru+++U48ePdzGe/To4Xquijh69Kh+/vln3X777a4xPz8/tW7dusLHkH75vY4cOSJfX1/X79WwYUP99NNP+uqrr9SwYUONGjVKAwYM0KBBg/Tyyy/rxIkTrsfHx8fr0UcfVb9+/ZScnOz2WmRkZGjx4sVur9mAAQNUUlKi7Oxs9e/fXyEhIbrpppv04IMP6h//+IfOnz/vUX7gekOZAa4DvXv31oABA/Tcc8+V2latWjVZluU29vPPP5fa79JpjkscDsdlx0pKSsrNc+l0SklJiQYNGqTMzEy3JSsry+3USN26dcs95q+Pe4llWR59cuvS63C54/z2ecp6zUpKStS5c+dSv9fhw4c1fPhwSVJqaqq2bdumyMhILVu2TK1atdLnn38u6ZfrmPbv36+BAwdq/fr1ateunZYvX+469hNPPOF23C+++EJZWVlq2bKlfH19tXv3br333nsKDAzUf/3XfykiIkJnzpyp8OsAXG8oM8B1Ijk5Wf/617+0detWt/Ebb7xRJ0+edHtzrsx7w1x6g5akoqIiZWRkuGZfbr31Vu3fv18tWrTQzTff7LZUtMBIUv369RUUFKTNmze7jW/dulVt27at8HFatmypGjVqaMeOHa6x/Px813U3l9x4441uMylZWVlusx+33nqrsrKy1KRJk1K/l5+fn2u/Tp06aerUqdq6davCw8O1dOlS17ZWrVrp6aef1rp16xQbG6vU1FTXsffv31/quDfffLNq1qwp6ZcZsH79+mnOnDnau3evjh07pvXr11f4dQCuN5QZ4DrRoUMHjRgxQq+88orbeJ8+ffR///d/mjNnjr766istWLBAq1evrrTnXbBggZYvX66DBw8qLi5Op0+f1ujRoyVJcXFx+vHHH/XAAw9ox44dOnr0qNatW6fRo0eruLjYo+eZPHmyZs+erWXLlunQoUOaMmWKMjMzNX78+Aofw9fXVyNHjtTkyZP12Wefaf/+/Ro9erSqVavmNltzxx13KCUlRbt379auXbv05JNPus1SjRgxQo0bN9bgwYO1adMmZWdnKz09XePHj9c333yj7OxsTZ06Vdu2bdPx48e1bt06HT58WG3bttWFCxc0duxYbdiwQcePH9eWLVu0c+dOVyl79tlntW3bNsXFxblmsVatWqWnnnpKkvTRRx/pf/7nf5SZmanjx4/r7bffVklJicenyoDrCWUGuI7MnDmz1OmRtm3b6tVXX9WCBQsUERGhHTt2XPGTPlcjOTlZs2fPVkREhDZt2qSVK1eqcePGkqSgoCBt2bJFxcXFGjBggMLDwzV+/Hj5+fm5XZ9TEePGjdPEiRM1ceJEdejQQWvWrNGqVasUFhbm0XHmzZun7t27689//rP69eunHj16qG3btqpVq5Zrn7lz5yo4OFi9e/fW8OHDNWnSJNWpU8e1vU6dOtq4caOaN2+u2NhYtW3bVqNHj9aFCxdUv3591alTRwcPHtS9996rVq1a6fHHH9fYsWP1xBNPyMfHR6dOndJDDz2kVq1aaejQoYqJidELL7wgSbrllluUnp6urKws9erVS506ddLzzz+vwMBASb98RPzDDz/UHXfcobZt2+q1117Te++9p/bt23v0OgDXE4f127/5AOAP5Ny5c2ratKnmzp2rRx55xO44AK5CdbsDAMC1tGfPHh08eFC333678vLyNGPGDEnS4MGDbU4G4GpRZgD84fztb3/ToUOHVLNmTXXu3FmbNm1ynRoDYB5OMwEAAKNxATAAADAaZQYAABiNMgMAAIxGmQEAAEajzAAAAKNRZgAAgNEoMwAAwGiUGQAAYLT/BzmQI1Hyv8AGAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def entropy(counts: List[int]) -> float: return -neg_entropy(counts)\n",
    "\n",
    "report_minimizing_tree(entropy, inconsistent=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We see that, as expected, the \"worst\" word, `'FUZZY'` is the first guess. Overall, we do pretty well, surviving up to 11 guesses a few times, with a median of 6."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Jotto\n",
    "\n",
    "[Jotto](https://en.wikipedia.org/wiki/Jotto) is a venerable word game (invented in 1955) that is quite similar to Wordle. The difference is that the reply in Jotto is an integer from 0 to 5 giving the number of matching letters, with no indication of which letter(s) are correct nor whether they are in the right position or not. There are several variants of Jotto; here are four key questions and my answers (designed to keep things simple):\n",
    "\n",
    "- How many letters can each word have? **Five**.\n",
    "- Does a guess have to be a word in the word list? **Yes.**\n",
    "- Can a word have repeated letters, like the \"E\" in \"ELECT\"? **No. Every word must have 5 distinct letters.**\n",
    "- What if the reply is \"5\", but the guess is not the target? **Not allowed.**<br>*(E.g., only one of the anagrams APERS/PARES/PARSE/PEARS/REAPS/SPARE/SPEAR  is allowed in the word list.)*\n",
    "\n",
    "We can make a Jotto word list by:\n",
    "- Starting with a word list (such as the Wordle list).\n",
    "- Discarding words that don't have 5 distinct letters.\n",
    "- Putting the remaining words into a dict of anagrams keyed by the set of letters.\n",
    "- Keeping only one word for each anagram."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "def jotto_allowable(wordlist) -> List[Word]:\n",
    "    \"\"\"Build a list of allowable Jotto words from an iterable of words.\"\"\"\n",
    "    anagrams = {frozenset(w): w for w in wordlist if len(set(w)) == 5 == len(w)}\n",
    "    return sorted(anagrams.values())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The right thing to do now would be to refactor the code to allow for the injection of a different `reply_for` function, and a different `wordlist`, so that either game could be played at any time.\n",
    "\n",
    "However, I'm going to take a shortcut: I'm going to require the programmer to call `setup_game` with the name of the game they want, `'jotto'` or `'wordle'`. This will set global variables accordingly. Notice we mutate `wordlist` rather than rebinding it, because it has already been assigned as a default parameter value in various functions, and we don't want to require the caller to explicitly override those defaults."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {},
   "outputs": [],
   "source": [
    "wordle_reply_for = reply_for      # Save the original Wordle reply_for function\n",
    "wordle_wordlist  = list(wordlist) # Save a copy of the original Wordle wordlist, which will be mutated"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [],
   "source": [
    "def jotto_reply_for(guess, target) -> Reply: \n",
    "    \"The number of letters in common between the target and guess\"\n",
    "    return len(set(target).intersection(guess))\n",
    "\n",
    "def setup_game(game: str) -> None:\n",
    "    \"Redefine global variables to allow play of either 'jotto' or 'wordle'.\"\n",
    "    global histogram_bins, reply_for, Correct\n",
    "    table = {'wordle': (10, wordle_reply_for, 5 * 'G', wordle_wordlist),\n",
    "             'jotto':  (16, jotto_reply_for,  5,       jotto_allowable(wordle_wordlist))}\n",
    "    histogram_bins, reply_for, Correct, wordlist[:] = table[game]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: ZONAL, Reply: 1; Remaining targets: 612\n",
      "Guess 2: ZESTY, Reply: 1; Remaining targets: 288\n",
      "Guess 3: FREAK, Reply: 2; Remaining targets: 83\n",
      "Guess 4: HOMER, Reply: 2; Remaining targets: 35\n",
      "Guess 5: PLIER, Reply: 1; Remaining targets: 12\n",
      "Guess 6: BEACH, Reply: 2; Remaining targets: 6\n",
      "Guess 7: HARDY, Reply: 5; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "setup_game('jotto')\n",
    "play(random_guesser)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: PROUD, Reply: 1; Remaining targets: 594\n",
      "Guess 2: QUASI, Reply: 1; Remaining targets: 307\n",
      "Guess 3: FIEND, Reply: 0; Remaining targets: 41\n",
      "Guess 4: CHART, Reply: 3; Remaining targets: 11\n",
      "Guess 5: CRAZY, Reply: 2; Remaining targets: 5\n",
      "Guess 6: MOCHA, Reply: 4; Remaining targets: 2\n",
      "Guess 7: CHAMP, Reply: 3; Remaining targets: 1\n",
      "Guess 8: HAVOC, Reply: 5; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "8"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "play(random_guesser)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Below we show that we can switch back to Wordle, and then back to Jotto again, and things still function properly:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: ANGLE, Reply: .....; Remaining targets: 309\n",
      "Guess 2: WISPY, Reply: .GG.G; Remaining targets: 4\n",
      "Guess 3: RISKY, Reply: GGGGG; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "3"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "setup_game ('wordle')\n",
    "play(random_guesser)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Guess 1: SHARK, Reply: 1; Remaining targets: 577\n",
      "Guess 2: TWANG, Reply: 1; Remaining targets: 250\n",
      "Guess 3: BRINY, Reply: 2; Remaining targets: 69\n",
      "Guess 4: GIVER, Reply: 1; Remaining targets: 26\n",
      "Guess 5: HYMEN, Reply: 2; Remaining targets: 7\n",
      "Guess 6: MOURN, Reply: 0; Remaining targets: 3\n",
      "Guess 7: PITHY, Reply: 5; Remaining targets: 1\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "7"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "setup_game('jotto')\n",
    "play(random_guesser)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reports on Consistent Jotto Guessers\n",
    "\n",
    "As with Wordle, we'll give reports on the Jotto guessers for various metrics, and for the random guesser:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the max of partition sizes over 1,391 targets; inconsistent guesses prohibited\n",
      "first guess: \"DRAPE\"\n",
      "median: 6 guesses, mean: 6.31 ± 1.43, worst: 16, best: 1\n",
      "cumulative: ≤2:0%, ≤3:2%, ≤4:7%, ≤5:24%, ≤6:58%, ≤7:88%, ≤8:95%, ≤9:97%, ≤10:99%\n",
      "CPU times: user 1.66 s, sys: 40.7 ms, total: 1.7 s\n",
      "Wall time: 1.54 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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LPXt29du9uVSU6dOVWFhoW3Jy8urrpcAAABcwKWHmS41duxY7dmzR1u2bLEbHzZsmO3nsLAwRUREKCgoSGvXrlVcXFyF/VitVlmtVqf3CwAAaoYaEWaeeuoprVmzRps2bVKLFi2uuq2/v7+CgoKUk5NTTd0BAICazKVhxjAMPfXUU1q1apUyMjLUunXraz7nxIkTysvLk7+/fzV0CAAAajqXnjOTkJCg9957T8uXL5enp6fy8/OVn5+vc+fOSZJOnz6tp59+Wl999ZWOHDmijIwMDRo0SM2aNdO9997rytYBAEAN4dKZmYULF0qSoqOj7caXLFmikSNHqm7dutq7d6/eeecdnTp1Sv7+/urTp49WrlwpT09PF3QMAABqGpcfZroaDw8PpaWlVVM3AADAjGrMpdkAAADXgzADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMrUrCzKlTp6piNwAAAA5zOMzMmjVLK1eutD0eOnSomjZtqubNm+ubb76p0uYAAACuxeEw88YbbygwMFCSlJ6ervT0dK1bt06xsbGaPHlylTcIAABwNW6OPuH48eO2MPPpp59q6NChiomJUatWrdStW7cqbxAAAOBqHJ6Zuemmm5SXlydJWr9+vfr16ydJMgxDpaWlVdsdAADANTg8MxMXF6f4+HgFBwfrxIkTio2NlSRlZ2erTZs2Vd4gAADA1TgcZl5++WW1atVKeXl5mj17tho1aiTpt8NPY8aMqfIGAQAArsbhMFOvXj09/fTTFcYnTJhQFf0AAAA45LruM/Puu++qV69eCggI0NGjRyVJ8+bN08cff+zQflJSUnT77bfL09NTPj4+uueee3TgwAG7bQzDUFJSkgICAuTh4aHo6Gjt27fvetoGAAC1kMNhZuHChUpMTFRsbKxOnTplO+m3SZMmmjdvnkP7yszMVEJCgr7++mulp6fr4sWLiomJ0ZkzZ2zbzJ49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qyFDhtzwB3VlZGVladGiRerUqZNT64SGhur48eO2Ze/evU6td/LkSfXs2VP16tXTunXr9O2332rOnDlOu6N1VlaW3esrv1nlX/7yF6fUmzVrll5//XUtWLBA+/fv1+zZs/XSSy/plVdecUq9co899pjS09P17rvvau/evYqJiVG/fv30448/3vC+r/W7Pnv2bM2dO1cLFixQVlaW/Pz81L9/fxUXFzut5pkzZ9SzZ0+lpqZed43K1jt79qx27dql559/Xrt27dJHH32kgwcPavDgwU6pJ0khISFasGCB9u7dqy1btqhVq1aKiYnRf/7zH6fVLLd69Wpt27atUrfbv9F6AwcOtPv9/Oyzz5xW7/vvv1evXr3Url07ZWRk6JtvvtHzzz+v+vXrX3dNp7vRL4OEYyQZq1atqtaaBQUFhiQjMzOzWuvedNNNxltvveXUGsXFxUZwcLCRnp5uREVFGePHj3dKnenTpxvh4eFO2feVPPvss0avXr2qtealxo8fb9x6661GWVmZU/Z/9913G6NGjbIbi4uLM/761786pZ5hGMbZs2eNunXrGp9++qndeHh4uDFt2rQqrfX73/WysjLDz8/PSE1NtY39+uuvhpeXl/H66687pealcnNzDUnG7t27q6TWteqV2759uyHJOHr0aLXUKywsNCQZn3/++Q3Xu1rNY8eOGc2bNzf+9a9/GUFBQcbLL7/stHojRowwhgwZUiX7r0y9YcOGOfX30BmYmfkDKCwslCR5e3tXS73S0lKtWLFCZ86cUY8ePZxaKyEhQXfffbf69evn1DqSlJOTo4CAALVu3VoPPPCADh8+7NR6a9asUUREhP7yl7/Ix8dHXbp00ZtvvunUmuXOnz+v9957T6NGjXLaF7T26tVL//znP3Xw4EFJ0jfffKMtW7borrvucko96bdDW6WlpRX+henh4aEtW7Y4ra4k5ebmKj8/XzExMbYxq9WqqKgobd261am1XamwsFAWi6VaviPv/PnzWrRokby8vBQeHu60OmVlZRo+fLgmT56s0NBQp9W5VEZGhnx8fBQSEqLHH39cBQUFTqlTVlamtWvXKiQkRAMGDJCPj4+6devm9NMjbhRhppYzDEOJiYnq1auXwsLCnFpr7969atSokaxWq0aPHq1Vq1apQ4cOTqu3YsUK7dq1SykpKU6rUa5bt2565513lJaW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5OPjU+F1eXl52bbr0qWLpk6dqq1btyosLEzLly+3rQsJCdHEiRO1YcMGxcXFacmSJbZ979u3r8J+27RpI3d3d0m/zYD169dPs2fP1p49e3TkyBFt3Lix0u8DUNsQZoBaomPHjnrooYf0yiuv2I1HR0frP//5j2bPnq3vv/9er776qtatW1dldV999VWtWrVK3333nRISEnTy5EmNGjVKkpSQkKBffvlFDz74oLZv367Dhw9rw4YNGjVqlEpLSx2qM3nyZM2aNUsrV67UgQMHNGXKFGVnZ2v8+PGV3oenp6dGjBihyZMn64svvtC+ffs0atQo1alTx262pm/fvlqwYIF27dqlHTt2aPTo0XazVA899JCaNWumIUOGaPPmzcrNzVVmZqbGjx+vY8eOKTc3V1OnTtVXX32lo0ePasOGDTp48KDat2+vc+fOaezYscrIyNDRo0f15ZdfKisryxbKnn32WX311VdKSEiwzWKtWbNGTz31lCTp008/1T/+8Q9lZ2fr6NGjeuedd1RWVubwoTKgNiHMALXIiy++WOHwSPv27fXaa6/p1VdfVXh4uLZv337FK32uR2pqqmbNmqXw8HBt3rxZH3/8sZo1ayZJCggI0JdffqnS0lINGDBAYWFhGj9+vLy8vOzOz6mMcePGadKkSZo0aZI6duyo9evXa82aNQoODnZoP3PnzlWPHj305z//Wf369VPPnj3Vvn171a9f37bNnDlzFBgYqN69eys+Pl5PP/20GjRoYFvfoEEDbdq0SS1btlRcXJzat2+vUaNG6dy5c2rcuLEaNGig7777Tvfdd59CQkL0xBNPaOzYsXryySdVt25dnThxQg8//LBCQkI0dOhQxcbG6oUXXpAkderUSZmZmcrJydGdd96pLl266Pnnn5e/v7+k3y4R/+ijj9S3b1+1b99er7/+uj744AOFhoY69D4AtYnF+P0nHwD8gZw5c0bNmzfXnDlz9Oijj7q6HQDXwc3VDQBAddq9e7e+++473XHHHSosLNSMGTMkSUOGDHFxZwCuF2EGwB/O3//+dx04cEDu7u7q2rWrNm/ebDs0BsB8OMwEAABMjROAAQCAqRFmAACAqRFmAACAqRFmAACAqRFmAACAqRFmAACAqRFmAACAqRFmAACAqf0/EB0gfFWx870AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(max, inconsistent=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the expectation of partition sizes over 1,391 targets; inconsistent guesses prohibited\n",
      "first guess: \"SOUTH\"\n",
      "median: 6 guesses, mean: 6.11 ± 1.22, worst: 14, best: 1\n",
      "cumulative: ≤2:0%, ≤3:2%, ≤4:8%, ≤5:26%, ≤6:64%, ≤7:93%, ≤8:98%, ≤9:99%, ≤10:99.5%\n",
      "CPU times: user 2.29 s, sys: 214 ms, total: 2.51 s\n",
      "Wall time: 1.48 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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2x1a25kKCwtlsViq5DvyLl++rEWLFsnb21vh4eEOq1NaWqrhw4drypQpCg0NdVid66WlpcnHx0chISEaPXq0CgoKHFKntLRUa9euVUhIiPr27SsfHx917NjR4csjfinCTDVnGIbi4+PVrVs3hYWFObRWdna26tatK6vVqjFjxmjVqlVq3bq1w+qtWLFCe/bsUVJSksNqXNOxY0e988472rhxo9566y3l5+erS5cuOn36tMNqHj16VAsXLlRwcLA2btyoMWPGaPz48XrnnXccVvOa1atX6+zZsxo5cqTDajz33HN69NFH1bJlS9WsWVPt27fXxIkT9eijjzqspqenpzp37qyXXnpJ3333nUpKSvTee+9p586dOnnypMPqSlJ+fr4kydfX127c19fXtq+6+fHHHzV16lTFxsY69EsLP/nkE9WtW1e1atXSq6++qtTUVDVs2NBh9WbNmiU3NzeNHz/eYTWuFx0drffff1+bN2/WnDlzlJGRoV69eqm4uLjSaxUUFOj8+fNKTk5Wv379tGnTJg0ePFgxMTFKT0+v9HqVxRRfZ4A7N27cOO3bt8/h/+qUpBYtWigrK0tnz57Vhx9+qBEjRig9Pd0hgSYvL08TJkzQpk2bquQ6bnR0tO3nNm3aqHPnzrrvvvu0bNkyxcfHO6RmaWmpIiIilJiYKElq37699u/fr4ULF+qxxx5zSM1rFi9erOjo6F+8FuBWVq5cqffee0/Lly9XaGiosrKyNHHiRAUEBGjEiBEOq/vuu+9q1KhRuvfee1WjRg396le/UmxsrPbs2eOwmtf7+UyXYRgOm/1ypitXruiRRx5RaWmpFixY4NBaPXv2VFZWlk6dOqW33npLQ4YM0c6dO+Xj41PptTIzMzV//nzt2bOnyv67DR061PZzWFiYIiIiFBQUpLVr1yomJqZSa11bgD9o0CBNmjRJktSuXTtt375db7zxhiIjIyu1XmVhZqYae/rpp7VmzRp99tlnatSokcPrubu7q3nz5oqIiFBSUpLCw8M1f/58h9TKzMxUQUGBOnToIDc3N7m5uSk9PV1/+9vf5ObmppKSEofUvaZOnTpq06aNcnJyHFbD39+/TBBs1aqVw99RcPz4cX366ad64oknHFpnypQpmjp1qh555BG1adNGw4cP16RJkxw+03bfffcpPT1d58+fV15ennbt2qUrV66oadOmDq177d1vP5+FKSgoKDNbY3ZXrlzRkCFDlJubq9TUVIfOykg//T42b95cnTp10uLFi+Xm5qbFixc7pNbWrVtVUFCgxo0b2157jh8/rsmTJ6tJkyYOqflz/v7+CgoKcsjrT8OGDeXm5uaU155fgjBTDRmGoXHjxumjjz7S5s2bHf4ifas+HDENKkm/+c1vlJ2draysLNsWERGhYcOGKSsrSzVq1HBI3WuKi4t18OBB+fv7O6xG165dy7yl/vDhww7/xvglS5bIx8dH/fv3d2idixcv6q677F+CatSo4fC3Zl9Tp04d+fv768yZM9q4caMGDRrk0HpNmzaVn5+f7V1i0k9rPNLT09WlSxeH1q5K14JMTk6OPv30UzVo0KDKe3Dka8/w4cO1b98+u9eegIAATZkyRRs3bnRIzZ87ffq08vLyHPL64+7urvvvv98prz2/BJeZqsD58+d15MgR2+3c3FxlZWWpfv36aty4caXXi4uL0/Lly/Xxxx/L09PT9i9Bb29veXh4VHo9SXr++ecVHR2twMBAnTt3TitWrFBaWpo2bNjgkHqenp5l1gDVqVNHDRo0cMjaoGeeeUYDBgxQ48aNVVBQoJdffllFRUUOvRwyadIkdenSRYmJiRoyZIh27dqlRYsWadGiRQ6rWVpaqiVLlmjEiBFyc3Psy8OAAQP0yiuvqHHjxgoNDdXevXs1d+5cjRo1yqF1N27cKMMw1KJFCx05ckRTpkxRixYt9Mc//vEXn/t2v+sTJ05UYmKigoODFRwcrMTERNWuXVuxsbEOq/nDDz/om2++sX3Wy7U/Un5+fnf0WUm3qhcQEKDf/e532rNnjz755BOVlJTYXn/q168vd3f3Sq3XoEEDvfLKKxo4cKD8/f11+vRpLViwQCdOnPhFHylwu+f05wGtZs2a8vPzU4sWLSq9Xv369ZWQkKCHH35Y/v7+OnbsmJ5//nk1bNhQgwcPdsjjmzJlioYOHaru3burZ8+e2rBhg/71r38pLS3tjupVCWe+lep/xWeffWZIKrONGDHCIfVuVEuSsWTJEofUMwzDGDVqlBEUFGS4u7sb99xzj/Gb3/zG2LRpk8Pq3Ygj35o9dOhQw9/f36hZs6YREBBgxMTEGPv373dIrev961//MsLCwgyr1Wq0bNnSWLRokUPrbdy40ZBkHDp0yKF1DMMwioqKjAkTJhiNGzc2atWqZTRr1syYPn26UVxc7NC6K1euNJo1a2a4u7sbfn5+RlxcnHH27NlKOfftftdLS0uNGTNmGH5+fobVajW6d+9uZGdnO7TmkiVLbrh/xowZlV7v2tu/b7R99tlnlV7v0qVLxuDBg42AgADD3d3d8Pf3NwYOHGjs2rXrjmqVp+aN/NK3Zt+q3sWLF42oqCjjnnvuMWrWrGk0btzYGDFihPHNN984pN41ixcvNpo3b27UqlXLCA8PN1avXn3H9aqCxTAMo7KCEQAAQFVjzQwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgyAO3Ls2DFZLBZlZWU5uxWbr776Sp06dVKtWrXUrl07Z7cDoIoQZgCTGjlypCwWi5KTk+3GV69eXS2/hbk8ZsyYoTp16ujQoUP697//7ex2AFQRwgxgYrVq1dKsWbN05swZZ7dSaS5fvnzH9/3666/VrVs3BQUFOeULDgE4B2EGMLHevXvLz89PSUlJNz0mISGhzCWXefPmqUmTJrbbI0eO1EMPPaTExET5+vqqXr16evHFF3X16lVNmTJF9evXV6NGjfT3v/+9zPm/+uordenSRbVq1VJoaGiZL6M7cOCAHnzwQdWtW1e+vr4aPny4Tp06Zdvfo0cPjRs3TvHx8WrYsKH69Olzw8dRWlqqmTNnqlGjRrJarWrXrp3dF5laLBZlZmZq5syZslgsSkhIuOF5zp07p2HDhtm+NfvVV19Vjx49NHHiRLtzrV692u5+9erV09KlS223v/32Ww0dOlR33323GjRooEGDBunYsWO2/Wlpafr1r3+tOnXqqF69euratauOHz8uSfryyy/Vs2dPeXp6ysvLSx06dNDu3btt992+fbu6d+8uDw8PBQYGavz48bpw4YJt/4IFCxQcHKxatWrJ19dXv/vd7274WIH/FYQZwMRq1KihxMREvfbaazpx4sQvOtfmzZv13XffacuWLZo7d64SEhL029/+Vnfffbd27typMWPGaMyYMcrLy7O735QpUzR58mTt3btXXbp00cCBA3X69GlJ0smTJxUZGal27dpp9+7d2rBhg77//nsNGTLE7hzLli2Tm5ubPv/8c7355ps37G/+/PmaM2eO/vrXv2rfvn3q27evBg4cqJycHFut0NBQTZ48WSdPntQzzzxzw/PEx8fr888/15o1a5SamqqtW7dqz549FXquLl68qJ49e6pu3brasmWLtm3bprp166pfv366fPmyrl69qoceekiRkZHat2+fvvjiCz355JO2y3/Dhg1To0aNlJGRoczMTE2dOlU1a9aUJGVnZ6tv376KiYnRvn37tHLlSm3btk3jxo2TJO3evVvjx4/XzJkzdejQIW3YsEHdu3evUP9AtePsb7oEcGdGjBhhDBo0yDAMw+jUqZMxatQowzAMY9WqVcb1v9ozZswwwsPD7e776quvGkFBQXbnCgoKMkpKSmxjLVq0MB544AHb7atXrxp16tQxPvjgA8MwDNs3JCcnJ9uOuXLlitGoUSNj1qxZhmEYxgsvvGBERUXZ1c7Ly7P7Zu7IyEijXbt2t328AQEBxiuvvGI3dv/99xtjx4613Q4PD7/lt0EXFRUZNWvWNP7xj3/Yxs6ePWvUrl3b7hvXJRmrVq2yu6+3t7ftm+cXL15stGjRwigtLbXtLy4uNjw8PIyNGzcap0+fNiQZaWlpN+zD09PTWLp06Q33DR8+3HjyySftxrZu3WrcddddxqVLl4wPP/zQ8PLyMoqKim76OIH/NczMANXArFmztGzZMh04cOCOzxEaGqq77vr/Lwm+vr5q06aN7XaNGjXUoEEDFRQU2N2vc+fOtp/d3NwUERGhgwcPSpIyMzP12WefqW7duratZcuWkn5a33JNRETELXsrKirSd999p65du9qNd+3a1VarPI4ePaorV67o17/+tW3M29tbLVq0KPc5pJ8e15EjR+Tp6Wl7XPXr19ePP/6or7/+WvXr19fIkSPVt29fDRgwQPPnz9fJkydt94+Pj9cTTzyh3r17Kzk52e65yMzM1NKlS+2es759+6q0tFS5ubnq06ePgoKC1KxZMw0fPlzvv/++Ll68WKH+geqGMANUA927d1ffvn31/PPPl9l31113yTAMu7ErV66UOe7aZY5rLBbLDcdKS0tv28+1yymlpaUaMGCAsrKy7LacnBy7SyN16tS57TmvP+81hmFU6J1b156HG53n53Vu9ZyVlpaqQ4cOZR7X4cOHFRsbK0lasmSJvvjiC3Xp0kUrV65USEiIduzYIemndUz79+9X//79tXnzZrVu3VqrVq2ynfupp56yO++XX36pnJwc3XffffL09NSePXv0wQcfyN/fX3/+858VHh6us2fPlvt5AKobwgxQTSQnJ+tf//qXtm/fbjd+zz33KD8/3+6Pc2V+Nsy1P9CSdPXqVWVmZtpmX371q19p//79atKkiZo3b263lTfASJKXl5cCAgK0bds2u/Ht27erVatW5T7Pfffdp5o1a2rXrl22saKiItu6m2vuueceu5mUnJwcu9mPX/3qV8rJyZGPj0+Zx+Xt7W07rn379po2bZq2b9+usLAwLV++3LYvJCREkyZN0qZNmxQTE6MlS5bYzr1///4y523evLnc3d0l/TQD1rt3b82ePVv79u3TsWPHtHnz5nI/D0B1Q5gBqok2bdpo2LBheu211+zGe/Toof/+97+aPXu2vv76a73++utav359pdV9/fXXtWrVKn311VeKi4vTmTNnNGrUKElSXFycfvjhBz366KPatWuXjh49qk2bNmnUqFEqKSmpUJ0pU6Zo1qxZWrlypQ4dOqSpU6cqKytLEyZMKPc5PD09NWLECE2ZMkWfffaZ9u/fr1GjRumuu+6ym63p1auXUlJStGfPHu3evVtjxoyxm6UaNmyYGjZsqEGDBmnr1q3Kzc1Venq6JkyYoBMnTig3N1fTpk3TF198oePHj2vTpk06fPiwWrVqpUuXLmncuHFKS0vT8ePH9fnnnysjI8MWyp577jl98cUXiouLs81irVmzRk8//bQk6ZNPPtHf/vY3ZWVl6fjx43rnnXdUWlpa4UtlQHVCmAGqkZdeeqnM5ZFWrVppwYIFev311xUeHq5du3bd9J0+dyI5OVmzZs1SeHi4tm7dqo8//lgNGzaUJAUEBOjzzz9XSUmJ+vbtq7CwME2YMEHe3t5263PKY/z48Zo8ebImT56sNm3aaMOGDVqzZo2Cg4MrdJ65c+eqc+fO+u1vf6vevXura9euatWqlWrVqmU7Zs6cOQoMDFT37t0VGxurZ555RrVr17btr127trZs2aLGjRsrJiZGrVq10qhRo3Tp0iV5eXmpdu3a+uqrr/Twww8rJCRETz75pMaNG6ennnpKNWrU0OnTp/XYY48pJCREQ4YMUXR0tF588UVJUtu2bZWenq6cnBw98MADat++vV544QX5+/tL+ukt4h999JF69eqlVq1a6Y033tAHH3yg0NDQCj0PQHViMX7+ygcA/0MuXLige++9V3PmzNHjjz/u7HYA3AE3ZzcAAFVp7969+uqrr/TrX/9ahYWFmjlzpiRp0KBBTu4MwJ0izAD4n/PXv/5Vhw4dkru7uzp06KCtW7faLo0BMB8uMwEAAFNjATAAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADC1/wdEinsXzNPFoAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(expectation, inconsistent=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the neg_entropy of partition sizes over 1,391 targets; inconsistent guesses prohibited\n",
      "first guess: \"STARE\"\n",
      "median: 6 guesses, mean: 6.31 ± 1.46, worst: 15, best: 1\n",
      "cumulative: ≤2:0%, ≤3:2%, ≤4:8%, ≤5:25%, ≤6:58%, ≤7:87%, ≤8:95%, ≤9:97%, ≤10:98%\n",
      "CPU times: user 2.43 s, sys: 177 ms, total: 2.61 s\n",
      "Wall time: 1.62 s\n"
     ]
    },
    {
     "data": {
      "image/png": "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kyayWq0aN26cVq9erU6dOjmt3sqVK7Vnzx6lpKQ4rUa5Hj166O2331Z6erreeustFRQUqHfv3jp9+rTTah47dkyLFi1ScHCw0tPTNW7cOE2cOFFvv/2202qWW7Nmjc6ePav4+Hin1Xjuuef0yCOPqEOHDmrQoIG6deumyZMn65FHHnFaTU9PT/Xq1UsvvfSSvvvuO5WWlurdd9/Vjh07dOrUKafVlWT7wtyff0mur69vhS/TrSt+/PFHTZ8+XXFxcU790sKPP/5YTZo0UcOGDfXqq68qIyNDLVq0cFq9OXPmyM3NTRMnTnRajWvFxMTovffe06ZNmzRv3jxlZ2drwIABKikpqfZahYWFOn/+vFJTUzVkyBBt3LhRDz74oGJjY5WVlVXt9apLrf86A9yeCRMmaN++fU7/V6cktW/fXjk5OTp79qw++OADjR49WllZWU4JNPn5+Zo0aZI2btxYI8dxY2JibD937txZvXr10t13363ly5crMTHRKTXLysoUERGh5ORkSVK3bt104MABLVq0SI899phTapZbsmSJYmJibvtcgJtZtWqV3n33Xa1YsUKhoaHKycnR5MmTFRAQoNGjRzut7jvvvKMxY8aoZcuWql+/vn71q18pLi5Oe/bscVrNa/18psswDKfNfrnSlStX9PDDD6usrExvvPGGU2v1799fOTk5+v777/XWW29pxIgR2rFjh3x8fKq91u7du7Vw4ULt2bOnxv67jRw50vZzWFiYIiIiFBQUpHXr1ik2NrZaa5WfgD98+HBNmTJFktS1a1dt27ZNb775piIjI6u1XnVhZqYOe/rpp7V27Vp99tlnatWqldPrubu7q127doqIiFBKSorCw8O1cOFCp9TavXu3CgsL1b17d7m5ucnNzU1ZWVn661//Kjc3N5WWljqlbrnGjRurc+fOys3NdVoNf3//CkGwY8eOTr+i4MSJE/r000/1xBNPOLXOtGnTNH36dD388MPq3LmzRo0apSlTpjh9pu3uu+9WVlaWzp8/r/z8fO3cuVNXrlxR27ZtnVq3/Oq3n8/CFBYWVpitMbsrV65oxIgRysvLU0ZGhlNnZaSffh/btWunnj17asmSJXJzc9OSJUucUmvLli0qLCxU69atbZ89J06c0NSpU9WmTRun1Pw5f39/BQUFOeXzp0WLFnJzc3PJZ8/tIMzUQYZhaMKE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tk0dO3as9H7uvvtuNWjQQDt37rSNFRcX2867KXfnnXfazaTk5ubazX786le/Um5urnx8fCq8Li8vL9t23bp104wZM7Rt2zaFhYVpxYoVtnUhISGaMmWKNm7cqNjYWC1dutS27wMHDlTYb7t27eTu7i7ppxmwgQMHau7cudq3b5+OHz+uTZs2Vfp9AOoawgxQR3Tu3FmPPvqoXnvtNbvxqKgo/ec//9HcuXP19ddf6/XXX9f69eurre7rr7+u1atX66uvvlJCQoLOnDmjMWPGSJISEhL0ww8/6JFHHtHOnTt17Ngxbdy4UWPGjFFpaalDdaZNm6Y5c+Zo1apVOnz4sKZPn66cnBxNmjSp0vvw9PTU6NGjNW3aNH322Wc6cOCAxowZo3r16tnN1gwYMEBpaWnas2ePdu3apXHjxtnNUj366KNq0aKFhg8fri1btigvL09ZWVmaNGmSTp48qby8PM2YMUNffPGFTpw4oY0bN+rIkSPq2LGjLl26pAkTJigzM1MnTpzQ559/ruzsbFsoe+655/TFF18oISHBNou1du1aPf3005Kkjz/+WH/961+Vk5OjEydO6O2331ZZWZnDh8qAuoQwA9QhL730UoXDIx07dtQbb7yh119/XeHh4dq5c+cNr/SpitTUVM2ZM0fh4eHasmWLPvroI7Vo0UKSFBAQoM8//1ylpaUaPHiwwsLCNGnSJHl5edmdn1MZEydO1NSpUzV16lR17txZGzZs0Nq1axUcHOzQfubPn69evXrpt7/9rQYOHKg+ffqoY8eOatiwoW2befPmKTAwUP369VNcXJyeeeYZNWrUyLa+UaNG2rx5s1q3bq3Y2Fh17NhRY8aM0aVLl9S0aVM1atRIX331lR566CGFhIToySef1IQJE/TUU0+pfv36On36tB577DGFhIRoxIgRiomJ0YsvvihJ6tKli7KyspSbm6t7771X3bp10wsvvCB/f39JP10i/uGHH2rAgAHq2LGj3nzzTb3//vsKDQ116H0A6hKL8fNPPgD4Bblw4YJatmypefPm6fHHH3d1OwCqwM3VDQBATdq7d6+++uor/frXv1ZRUZFmz54tSRo+fLiLOwNQVYQZAL84f/nLX3T48GG5u7ure/fu2rJli+3QGADz4TATAAAwNU4ABgAApkaYAQAApkaYAQAApkaYAQAApkaYAQAApkaYAQAApkaYAQAApkaYAQAApvb/AFWlL9TEA1jPAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(neg_entropy, inconsistent=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "median: 7 guesses, mean: 6.65 ± 1.46, worst: 13, best: 2\n",
      "cumulative: ≤2:0%, ≤3:2%, ≤4:7%, ≤5:20%, ≤6:44%, ≤7:75%, ≤8:91%, ≤9:97%, ≤10:99.3%\n",
      "CPU times: user 2.53 s, sys: 217 ms, total: 2.75 s\n",
      "Wall time: 1.61 s\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGwCAYAAABcnuQpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA0UklEQVR4nO3de1RVdf7/8ddJ5IgKGBo3RTTFu6IjjYom6ChKjlo0o0VjOnbRr5gXzNL8+pVsBPQ7mk6UjY1jNmW65luakynSGKhZXlDSMVNMNCwZJi/gLVTYvz9anF+EF46xOWfT87HWXsv92fvs9/ucOseXn733OTbDMAwBAABY1B2ubgAAAOCnIMwAAABLI8wAAABLI8wAAABLI8wAAABLI8wAAABLI8wAAABL83B1A2YrKyvTN998I29vb9lsNle3AwAAqsAwDJ0/f17BwcG6446bz73U+jDzzTffKCQkxNVtAACA25Cfn69mzZrddJ9aH2a8vb0lff9i+Pj4uLgbAABQFcXFxQoJCXH8PX4ztT7MlJ9a8vHxIcwAAGAxVblEhAuAAQCApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApRFmAACApXm4ugEA5msxY4PpNY6nDjG9BgBcDzMzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0ggzAADA0lwaZpYuXaouXbrIx8dHPj4+6tWrlzZu3OjYbhiGkpKSFBwcLC8vL0VHR+vgwYMu7BgAALgbl4aZZs2aKTU1VXv27NGePXvUv39/DR8+3BFYFixYoEWLFiktLU27d+9WYGCgBg4cqPPnz7uybQAA4EZcGmaGDh2q++67T23atFGbNm00b948NWzYUJ9++qkMw9DixYs1a9YsxcXFqVOnTlq5cqUuXbqkVatW3fCYJSUlKi4urrAAAIDay22umSktLdXq1at18eJF9erVS3l5eSooKFBMTIxjH7vdrqioKO3YseOGx0lJSZGvr69jCQkJqYn2AQCAi7g8zBw4cEANGzaU3W7X+PHjtXbtWnXo0EEFBQWSpICAgAr7BwQEOLZdz8yZM1VUVORY8vPzTe0fAAC4lst/Nbtt27bKycnRuXPn9M4772j06NHKyspybLfZbBX2Nwyj0tgP2e122e120/oFAADuxeUzM56enmrdurUiIiKUkpKi8PBwLVmyRIGBgZJUaRamsLCw0mwNAAD4+XJ5mPkxwzBUUlKili1bKjAwUBkZGY5tV65cUVZWliIjI13YIQAAcCcuPc303HPPKTY2ViEhITp//rxWr16tzMxMbdq0STabTVOmTFFycrLCwsIUFham5ORk1a9fX/Hx8a5sGwAAuBGXhpl///vfGjVqlE6dOiVfX1916dJFmzZt0sCBAyVJzzzzjC5fvqwJEybo7Nmz6tGjhzZv3ixvb29Xtg0AANyIzTAMw9VNmKm4uFi+vr4qKiqSj4+Pq9sBXKLFjA2m1zieOsT0GgB+Ppz5+9vtrpkBAABwBmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYmkvDTEpKiu655x55e3vL399f999/vw4fPlxhnzFjxshms1VYevbs6aKOAQCAu3FpmMnKylJCQoI+/fRTZWRk6Nq1a4qJidHFixcr7Dd48GCdOnXKsXzwwQcu6hgAALgbD1cW37RpU4X1FStWyN/fX9nZ2erbt69j3G63KzAwsKbbAwAAFuBW18wUFRVJkvz8/CqMZ2Zmyt/fX23atNETTzyhwsLCGx6jpKRExcXFFRYAAFB7uU2YMQxDiYmJ6tOnjzp16uQYj42N1VtvvaUtW7Zo4cKF2r17t/r376+SkpLrHiclJUW+vr6OJSQkpKaeAgAAcAGbYRiGq5uQpISEBG3YsEHbt29Xs2bNbrjfqVOnFBoaqtWrVysuLq7S9pKSkgpBp7i4WCEhISoqKpKPj48pvQPursWMDabXOJ46xPQaAH4+iouL5evrW6W/v116zUy5p556SuvXr9fWrVtvGmQkKSgoSKGhocrNzb3udrvdLrvdbkabAADADbk0zBiGoaeeekpr165VZmamWrZsecvHnD59Wvn5+QoKCqqBDgEAgLtz6TUzCQkJevPNN7Vq1Sp5e3uroKBABQUFunz5siTpwoULevrpp/XJJ5/o+PHjyszM1NChQ9WkSRM98MADrmwdAAC4CZfOzCxdulSSFB0dXWF8xYoVGjNmjOrUqaMDBw7ojTfe0Llz5xQUFKR+/fppzZo18vb2dkHHAADA3bj8NNPNeHl5KT09vYa6AQAAVuQ2t2YDAADcDsIMAACwNMIMAACwNMIMAACwNMIMAACwNMIMAACwNLf4OQPg56QmfidJ4reSAPx8MDMDAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAsjTADAAAszaVhJiUlRffcc4+8vb3l7++v+++/X4cPH66wj2EYSkpKUnBwsLy8vBQdHa2DBw+6qGMAAOBuXBpmsrKylJCQoE8//VQZGRm6du2aYmJidPHiRcc+CxYs0KJFi5SWlqbdu3crMDBQAwcO1Pnz513YOQAAcBceriy+adOmCusrVqyQv7+/srOz1bdvXxmGocWLF2vWrFmKi4uTJK1cuVIBAQFatWqVxo0b54q2AQCAG3Gra2aKiookSX5+fpKkvLw8FRQUKCYmxrGP3W5XVFSUduzYcd1jlJSUqLi4uMICAABqL7cJM4ZhKDExUX369FGnTp0kSQUFBZKkgICACvsGBAQ4tv1YSkqKfH19HUtISIi5jQMAAJdymzAzceJE7d+/X2+//XalbTabrcK6YRiVxsrNnDlTRUVFjiU/P9+UfgEAgHtw6TUz5Z566imtX79eW7duVbNmzRzjgYGBkr6foQkKCnKMFxYWVpqtKWe322W3281tGAAAuI1qmZk5d+7cbT3OMAxN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aWk1Ui8rK0sJCQn69NNPlZGRoWvXrikmJkYXL140rWazZs2UmpqqPXv2aM+ePerfv7+GDx/+kz+oq2L37t1atmyZunTpYmqdjh076tSpU47lwIEDptY7e/asevfurbp162rjxo36/PPPtXDhQtO+0Xr37t0Vnl/5l1X+9re/NaXe/Pnz9eqrryotLU2HDh3SggUL9L//+7966aWXTKlX7vHHH1dGRob+9re/6cCBA4qJidGAAQP09ddf/+Rj3+q9vmDBAi1atEhpaWnavXu3AgMDNXDgQJ0/f960mhcvXlTv3r2Vmpp62zWqWu/SpUvau3evZs+erb179+rdd9/VkSNHNGzYMFPqSVKbNm2UlpamAwcOaPv27WrRooViYmL0n//8x7Sa5datW6edO3dW6ev2f2q9wYMHV3h/fvDBB6bV+/LLL9WnTx+1a9dOmZmZ+uyzzzR79mzVq1fvtmua7qf+GCScI8lYu3ZtjdYsLCw0JBlZWVk1WvfOO+80/vKXv5ha4/z580ZYWJiRkZFhREVFGZMnTzalzpw5c4zw8HBTjn0jzz77rNGnT58arflDkydPNlq1amWUlZWZcvwhQ4YYY8eOrTAWFxdn/O53vzOlnmEYxqVLl4w6deoY77//foXx8PBwY9asWdVa68fv9bKyMiMwMNBITU11jH333XeGr6+v8eqrr5pS84fy8vIMSca+ffuqpdat6pXbtWuXIck4ceJEjdQrKioyJBkffvjhT653s5onT540mjZtavzrX/8yQkNDjRdffNG0eqNHjzaGDx9eLcevSr2RI0ea+j40AzMzPwNFRUWSJD8/vxqpV1paqtWrV+vixYvq1auXqbUSEhI0ZMgQDRgwwNQ6kpSbm6vg4GC1bNlSDz30kI4dO2ZqvfXr1ysiIkK//e1v5e/vr27duum1114ztWa5K1eu6M0339TYsWNN+4HWPn366J///KeOHDkiSfrss8+0fft23XfffabUk74/tVVaWlrpX5heXl7avn27aXUlKS8vTwUFBYqJiXGM2e12RUVFaceOHabWdqWioiLZbLYa+Y28K1euaNmyZfL19VV4eLhpdcrKyjRq1ChNnz5dHTt2NK3OD2VmZsrf319t2rTRE088ocLCQlPqlJWVacOGDWrTpo0GDRokf39/9ejRw/TLI34qwkwtZxiGEhMT1adPH3Xq1MnUWgcOHFDDhg1lt9s1fvx4rV27Vh06dDCt3urVq7V3716lpKSYVqNcjx499MYbbyg9PV2vvfaaCgoKFBkZqdOnT5tW89ixY1q6dKnCwsKUnp6u8ePHa9KkSXrjjTdMq1lu3bp1OnfunMaMGWNajWeffVYPP/yw2rVrp7p166pbt26aMmWKHn74YdNqent7q1evXnrhhRf0zTffqLS0VG+++aZ27typU6dOmVZXkuMHc3/8I7kBAQGVfky3tvjuu+80Y8YMxcfHm/qjhe+//74aNmyoevXq6cUXX1RGRoaaNGliWr358+fLw8NDkyZNMq3GD8XGxuqtt97Sli1btHDhQu3evVv9+/dXSUlJtdcqLCzUhQsXlJqaqsGDB2vz5s164IEHFBcXp6ysrGqvV13c/ucM8NNMnDhR+/fvN/1fnZLUtm1b5eTk6Ny5c3rnnXc0evRoZWVlmRJo8vPzNXnyZG3evLlGzuPGxsY6/ty5c2f16tVLrVq10sqVK5WYmGhKzbKyMkVERCg5OVmS1K1bNx08eFBLly7Vo48+akrNcsuXL1dsbOxPvhbgZtasWaM333xTq1atUseOHZWTk6MpU6YoODhYo0ePNq3u3/72N40dO1ZNmzZVnTp19Itf/ELx8fHau3evaTV/6MczXYZhmDb75UpXr17VQw89pLKyMr3yyium1urXr59ycnL07bff6rXXXtOIESO0c+dO+fv7V3ut7OxsLVmyRHv37q2x/24jR450/LlTp06KiIhQaGioNmzYoLi4uGqtVX4B/vDhwzV16lRJUteuXbVjxw69+uqrioqKqtZ61YWZmVrsqaee0vr16/XRRx+pWbNmptfz9PRU69atFRERoZSUFIWHh2vJkiWm1MrOzlZhYaG6d+8uDw8PeXh4KCsrS3/605/k4eGh0tJSU+qWa9CggTp37qzc3FzTagQFBVUKgu3btzf9joITJ07oww8/1OOPP25qnenTp2vGjBl66KGH1LlzZ40aNUpTp041faatVatWysrK0oULF5Sfn69du3bp6tWratmypal1y+9++/EsTGFhYaXZGqu7evWqRowYoby8PGVkZJg6KyN9/35s3bq1evbsqeXLl8vDw0PLly83pda2bdtUWFio5s2bOz57Tpw4oWnTpqlFixam1PyxoKAghYaGmvL506RJE3l4eLjks+enIMzUQoZhaOLEiXr33Xe1ZcsW0z+kb9aHGdOgkvSrX/1KBw4cUE5OjmOJiIjQI488opycHNWpU8eUuuVKSkp06NAhBQUFmVajd+/elW6pP3LkiOk/srpixQr5+/tryJAhpta5dOmS7rij4kdQnTp1TL81u1yDBg0UFBSks2fPKj09XcOHDze1XsuWLRUYGOi4S0z6/hqPrKwsRUZGmlq7JpUHmdzcXH344Ydq3Lhxjfdg5mfPqFGjtH///gqfPcHBwZo+fbrS09NNqfljp0+fVn5+vimfP56enrrnnntc8tnzU3CaqQZcuHBBR48edazn5eUpJydHfn5+at68ebXXS0hI0KpVq/Tee+/J29vb8S9BX19feXl5VXs9SXruuecUGxurkJAQnT9/XqtXr1ZmZqY2bdpkSj1vb+9K1wA1aNBAjRs3NuXaoKefflpDhw5V8+bNVVhYqD/84Q8qLi429XTI1KlTFRkZqeTkZI0YMUK7du3SsmXLtGzZMtNqlpWVacWKFRo9erQ8PMz9eBg6dKjmzZun5s2bq2PHjtq3b58WLVqksWPHmlo3PT1dhmGobdu2Onr0qKZPn662bdvq97///U8+9q3e61OmTFFycrLCwsIUFham5ORk1a9fX/Hx8abVPHPmjL766ivHd72U/yUVGBh4W9+VdLN6wcHB+s1vfqO9e/fq/fffV2lpqePzx8/PT56entVar3Hjxpo3b56GDRumoKAgnT59Wq+88opOnjz5k75S4Fav6Y8DWt26dRUYGKi2bdtWez0/Pz8lJSXpwQcfVFBQkI4fP67nnntOTZo00QMPPGDK85s+fbpGjhypvn37ql+/ftq0aZP+8Y9/KDMz87bq1QhX3kr1c/HRRx8Zkioto0ePNqXe9WpJMlasWGFKPcMwjLFjxxqhoaGGp6encddddxm/+tWvjM2bN5tW73rMvDV75MiRRlBQkFG3bl0jODjYiIuLMw4ePGhKrR/6xz/+YXTq1Mmw2+1Gu3btjGXLlplaLz093ZBkHD582NQ6hmEYxcXFxuTJk43mzZsb9erVM+6++25j1qxZRklJial116xZY9x9992Gp6enERgYaCQkJBjnzp2rlmPf6r1eVlZmzJkzxwgMDDTsdrvRt29f48CBA6bWXLFixXW3z5kzp9rrld/+fb3lo48+qvZ6ly9fNh544AEjODjY8PT0NIKCgoxhw4YZu3btuq1aVal5PT/11uyb1bt06ZIRExNj3HXXXUbdunWN5s2bG6NHjza++uorU+qVW758udG6dWujXr16Rnh4uLFu3brbrlcTbIZhGNUVjAAAAGoa18wAAABLI8wAAABLI8wAAABLI8wAAABLI8wAAABLI8wAAABLI8wAAABLI8wAAABLI8wAuC3Hjx+XzWZTTk6Oq1tx+OKLL9SzZ0/Vq1dPXbt2dXU7AGoIYQawqDFjxshmsyk1NbXC+Lp162Sz2VzUlWvNmTNHDRo00OHDh/XPf/7T1e0AqCGEGcDC6tWrp/nz5+vs2bOubqXaXLly5bYf++WXX6pPnz4KDQ11ya81A3ANwgxgYQMGDFBgYKBSUlJuuE9SUlKlUy6LFy9WixYtHOtjxozR/fffr+TkZAUEBKhRo0Z6/vnnde3aNU2fPl1+fn5q1qyZ/vrXv1Y6/hdffKHIyEjVq1dPHTt2rPTLup9//rnuu+8+NWzYUAEBARo1apS+/fZbx/bo6GhNnDhRiYmJatKkiQYOHHjd51FWVqa5c+eqWbNmstvt6tq1a4VfZbfZbMrOztbcuXNls9mUlJR03eOcP39ejzzyiBo0aKCgoCC9+OKLio6O1pQpUyoca926dRUe16hRI73++uuO9a+//lojR47UnXfeqcaNG2v48OE6fvy4Y3tmZqZ++ctfqkGDBmrUqJF69+6tEydOSJI+++wz9evXT97e3vLx8VH37t21Z88ex2N37Nihvn37ysvLSyEhIZo0aZIuXrzo2P7KK68oLCxM9erVU0BAgH7zm99c97kCPxeEGcDC6tSpo+TkZL300ks6efLkTzrWli1b9M0332jr1q1atGiRkpKS9Otf/1p33nmndu7cqfHjx2v8+PHKz8+v8Ljp06dr2rRp2rdvnyIjIzVs2DCdPn1aknTq1ClFRUWpa9eu2rNnjzZt2qR///vfGjFiRIVjrFy5Uh4eHvr444/15z//+br9LVmyRAsXLtQf//hH7d+/X4MGDdKwYcOUm5vrqNWxY0dNmzZNp06d0tNPP33d4yQmJurjjz/W+vXrlZGRoW3btmnv3r1OvVaXLl1Sv3791LBhQ23dulXbt29Xw4YNNXjwYF25ckXXrl3T/fffr6ioKO3fv1+ffPKJnnzyScfpv0ceeUTNmjXT7t27lZ2drRkzZqhu3bqSpAMHDmjQoEGKi4vT/v37tWbNGm3fvl0TJ06UJO3Zs0eTJk3S3LlzdfjwYW3atEl9+/Z1qn+g1nH1z3YDuD2jR482hg8fbhiGYfTs2dMYO3asYRiGsXbtWuOHb+05c+YY4eHhFR774osvGqGhoRWOFRoaapSWljrG2rZta9x7772O9WvXrhkNGjQw3n77bcMwDCMvL8+QZKSmpjr2uXr1qtGsWTNj/vz5hmEYxuzZs42YmJgKtfPz8w1JxuHDhw3DMIyoqCija9eut3y+wcHBxrx58yqM3XPPPcaECRMc6+Hh4cacOXNueIzi4mKjbt26xt///nfH2Llz54z69esbkydPdoxJMtauXVvhsb6+vsaKFSsMwzCM5cuXG23btjXKysoc20tKSgwvLy8jPT3dOH36tCHJyMzMvG4f3t7exuuvv37dbaNGjTKefPLJCmPbtm0z7rjjDuPy5cvGO++8Y/j4+BjFxcU3fJ7Azw0zM0AtMH/+fK1cuVKff/75bR+jY8eOuuOO//+REBAQoM6dOzvW69Spo8aNG6uwsLDC43r16uX4s4eHhyIiInTo0CFJUnZ2tj766CM1bNjQsbRr107S99e3lIuIiLhpb8XFxfrmm2/Uu3fvCuO9e/d21KqKY8eO6erVq/rlL3/pGPP19VXbtm2rfAzp++d19OhReXt7O56Xn5+fvvvuO3355Zfy8/PTmDFjNGjQIA0dOlRLlizRqVOnHI9PTEzU448/rgEDBig1NbXCa5Gdna3XX3+9wms2aNAglZWVKS8vTwMHDlRoaKjuvvtujRo1Sm+99ZYuXbrkVP9AbUOYAWqBvn37atCgQXruuecqbbvjjjtkGEaFsatXr1bar/w0RzmbzXbdsbKyslv2U346paysTEOHDlVOTk6FJTc3t8KpkQYNGtzymD88bjnDMJy6c6v8dbjecX5c52avWVlZmbp3717peR05ckTx8fGSpBUrVuiTTz5RZGSk1qxZozZt2ujTTz+V9P11TAcPHtSQIUO0ZcsWdejQQWvXrnUce9y4cRWO+9lnnyk3N1etWrWSt7e39u7dq7fffltBQUH6n//5H4WHh+vcuXNVfh2A2oYwA9QSqamp+sc//qEdO3ZUGL/rrrtUUFBQ4S/n6vxumPK/oCXp2rVrys7Odsy+/OIXv9DBgwfVokULtW7dusJS1QAjST4+PgoODtb27dsrjO/YsUPt27ev8nFatWqlunXrateuXY6x4uJix3U35e66664KMym5ubkVZj9+8YtfKDc3V/7+/pWel6+vr2O/bt26aebMmdqxY4c6deqkVatWOba1adNGU6dO1ebNmxUXF6cVK1Y4jn3w4MFKx23durU8PT0lfT8DNmDAAC1YsED79+/X8ePHtWXLliq/DkBtQ5gBaonOnTvrkUce0UsvvVRhPDo6Wv/5z3+0YMECffnll3r55Ze1cePGaqv78ssva+3atfriiy+UkJCgs2fPauzYsZKkhIQEnTlzRg8//LB27dqlY8eOafPmzRo7dqxKS0udqjN9+nTNnz9fa9as0eHDhzVjxgzl5ORo8uTJVT6Gt7e3Ro8erenTp+ujjz7SwYMHNXbsWN1xxx0VZmv69++vtLQ07d27V3v27NH48eMrzFI98sgjatKkiYYPH65t27YpLy9PWVlZmjx5sk6ePKm8vDzNnDlTn3zyiU6cOKHNmzfryJEjat++vS5fvqyJEycqMzNTJ06c0Mcff6zdu3c7Qtmzzz6rTz75RAkJCY5ZrPXr1+upp56SJL3//vv605/+pJycHJ04cUJvvPGGysrKnD5VBtQmhBmgFnnhhRcqnR5p3769XnnlFb388ssKDw/Xrl27bninz+1ITU3V/PnzFR4erm3btum9995TkyZNJEnBwcH6+OOPVVpaqkGDBqlTp06aPHmyfH19K1yfUxWTJk3StGnTNG3aNHXu3FmbNm3S+vXrFRYW5tRxFi1apF69eunXv/61BgwYoN69e6t9+/aqV6+eY5+FCxcqJCREffv2VXx8vJ5++mnVr1/fsb1+/fraunWrmjdvrri4OLVv315jx47V5cuX5ePjo/r16+uLL77Qgw8+qDZt2ujJJ5/UxIkTNW7cONWpU0enT5/Wo48+qjZt2mjEiBGKjY3V888/L0nq0qWLsrKylJubq3vvvVfdunXT7NmzFRQUJOn7W8Tfffdd9e/fX+3bt9err76qt99+Wx07dnTqdQBqE5vx408+APgZuXjxopo2baqFCxfqsccec3U7AG6Dh6sbAICatG/fPn3xxRf65S9/qaKiIs2dO1eSNHz4cBd3BuB2EWYA/Oz88Y9/1OHDh+Xp6anu3btr27ZtjlNjAKyH00wAAMDSuAAYAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABY2v8Dtf0SUlF2DksAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report([play(random_guesser, target=target, verbose=False) for target in wordlist])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Reports on Inconsistent Jotto Guessers"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the max of partition sizes over 1,391 targets; inconsistent guesses allowed\n",
      "first guess: \"DRAPE\"\n",
      "median: 6 guesses, mean: 6.38 ± 0.93, worst: 9, best: 1\n",
      "cumulative: ≤2:0%, ≤3:1%, ≤4:3%, ≤5:13%, ≤6:52%, ≤7:93%, ≤8:99.8%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 4.98 s, sys: 51.4 ms, total: 5.03 s\n",
      "Wall time: 4.83 s\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGwCAYAAABcnuQpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA31klEQVR4nO3de1hVdd7//9dOdIsKmBonRbQ8i6IjjYom6HgiR02a0cIxGTs5Yh4wy8PdV7IR0Hs0nSjLckwr02vu0pw8II2Bmql4IBk1xUTDkphMAQ+hwvr90eX+ucMD29jsvej5uK51Xa7PWnu935ti+/Kz1l7LYhiGIQAAAJO6y9UNAAAA/BKEGQAAYGqEGQAAYGqEGQAAYGqEGQAAYGqEGQAAYGqEGQAAYGoerm7A2crKyvTtt9/Ky8tLFovF1e0AAIAKMAxDxcXFCgwM1F133XrupdqHmW+//VZBQUGubgMAANyBvLw8NWnS5Jb7VPsw4+XlJemnH4a3t7eLuwEAABVRVFSkoKAg29/jt1Ltw8y1U0ve3t6EGQAATKYil4hwATAAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1wgwAADA1D1c3AMD5mk1b7/QaJ5IHOb0GANwIMzMAAMDUCDMAAMDU3CbMJCUlyWKxaNKkSbYxwzCUkJCgwMBAeXp6KjIyUgcPHnRdkwAAwO24RZjJzMzUkiVL1LFjR7vxefPmacGCBUpJSVFmZqb8/f3Vr18/FRcXu6hTAADgblweZs6fP6+RI0fqzTff1N13320bNwxDCxcu1MyZMxUdHa2QkBAtX75cFy9e1MqVK13YMQAAcCcuDzNxcXEaNGiQ+vbtazeem5ur/Px89e/f3zZmtVoVERGhHTt23PR4JSUlKioqslsAAED15dKvZq9atUr79u1TZmZmuW35+fmSJD8/P7txPz8/nTx58qbHTEpK0osvvli5jQIAALflspmZvLw8TZw4Ue+++65q16590/0sFovdumEY5cauN336dBUWFtqWvLy8SusZAAC4H5fNzOzdu1cFBQXq0qWLbay0tFRbt25VSkqKjhw5IumnGZqAgADbPgUFBeVma65ntVpltVqd1zgAAHArLpuZ+d3vfqfs7GxlZWXZlrCwMI0cOVJZWVm699575e/vr7S0NNtrLl++rIyMDIWHh7uqbQAA4GZcNjPj5eWlkJAQu7G6deuqYcOGtvFJkyYpMTFRLVu2VMuWLZWYmKg6deooJibGFS0DAAA35NbPZnruued06dIljRs3TmfPnlXXrl21efNmeXl5ubo14I5VxXOSJJ6VBODXw63CTHp6ut26xWJRQkKCEhISXNIPAABwfy6/zwwAAMAvQZgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACmRpgBAACm5tIws3jxYnXs2FHe3t7y9vZW9+7dtXHjRtv22NhYWSwWu6Vbt24u7BgAALgbD1cWb9KkiZKTk9WiRQtJ0vLlyzV06FDt379f7du3lyQNHDhQy5Yts72mVq1aLukVAAC4J5eGmcGDB9utz5kzR4sXL9bOnTttYcZqtcrf398V7QEAABNwm2tmSktLtWrVKl24cEHdu3e3jaenp8vX11etWrXSk08+qYKCglsep6SkREVFRXYLAACovlweZrKzs1WvXj1ZrVaNHTtWa9asUbt27SRJUVFReu+997RlyxbNnz9fmZmZ6tOnj0pKSm56vKSkJPn4+NiWoKCgqnorAADABSyGYRiubODy5cv6+uuvde7cOX3wwQd66623lJGRYQs01zt9+rSCg4O1atUqRUdH3/B4JSUldmGnqKhIQUFBKiwslLe3t9PeB1BRzaatr5I6J5IHVWnN6+sBwC9VVFQkHx+fCv397dJrZqSfLui9dgFwWFiYMjMztWjRIr3xxhvl9g0ICFBwcLBycnJuejyr1Sqr1eq0fgEAgHtx+WmmnzMM46ankc6cOaO8vDwFBARUcVcAAMBduXRmZsaMGYqKilJQUJCKi4u1atUqpaena9OmTTp//rwSEhL08MMPKyAgQCdOnNCMGTPUqFEjDRs2zJVtAwAAN+LSMPPdd99p1KhROn36tHx8fNSxY0dt2rRJ/fr106VLl5Sdna0VK1bo3LlzCggIUO/evbV69Wp5eXm5sm0AAOBGXBpmli5detNtnp6eSk1NrcJuAACAGbndNTMAAACOIMwAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTc2mYWbx4sTp27Chvb295e3ure/fu2rhxo227YRhKSEhQYGCgPD09FRkZqYMHD7qwYwAA4G5cGmaaNGmi5ORk7dmzR3v27FGfPn00dOhQW2CZN2+eFixYoJSUFGVmZsrf31/9+vVTcXGxK9sGAABuxKVhZvDgwXrwwQfVqlUrtWrVSnPmzFG9evW0c+dOGYahhQsXaubMmYqOjlZISIiWL1+uixcvauXKla5sGwAAuBG3uWamtLRUq1at0oULF9S9e3fl5uYqPz9f/fv3t+1jtVoVERGhHTt23PQ4JSUlKioqslsAAED15fIwk52drXr16slqtWrs2LFas2aN2rVrp/z8fEmSn5+f3f5+fn62bTeSlJQkHx8f2xIUFOTU/gEAgGu5PMy0bt1aWVlZ2rlzp/7yl79o9OjROnTokG27xWKx298wjHJj15s+fboKCwttS15entN6BwAArufh6gZq1aqlFi1aSJLCwsKUmZmpRYsW6fnnn5ck5efnKyAgwLZ/QUFBudma61mtVlmtVuc2DQAA3IbLZ2Z+zjAMlZSUqHnz5vL391daWppt2+XLl5WRkaHw8HAXdggAANyJS2dmZsyYoaioKAUFBam4uFirVq1Senq6Nm3aJIvFokmTJikxMVEtW7ZUy5YtlZiYqDp16igmJsaVbQMAADfi0jDz3XffadSoUTp9+rR8fHzUsWNHbdq0Sf369ZMkPffcc7p06ZLGjRuns2fPqmvXrtq8ebO8vLxc2TYAAHAjLg0zS5cuveV2i8WihIQEJSQkVE1DAADAdNzumhkAAABHEGYAAICpEWYAAICpEWYAAICpEWYAAICpEWYAAICpEWYAAICpEWYAAICpEWYAAICp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rVrpySefVEFBwS33T0pKko+Pj20JCgqqok4BAIAruHWYiYqK0nvvvactW7Zo/vz5yszMVJ8+fexmXn5u+vTpKiwstC15eXlV2DEAAKhqLj3NdDsjRoyw/TkkJERhYWEKDg7W+vXrFR0dfcPXWK1WWa3WqmoRAAC4mFvPzPxcQECAgoODlZOT4+pWAACAmzBVmDlz5ozy8vIUEBDg6lYAAICbcOlppvPnz+vYsWO29dzcXGVlZalBgwZq0KCBEhIS9PDDDysgIEAnTpzQjBkz1KhRIw0bNsyFXQMAAHfi0jCzZ88e9e7d27YeHx8vSRo9erQWL16s7OxsrVixQufOnVNAQIB69+6t1atXy8vLy1UtAwAAN+PSMBMZGSnDMG66PTU1tQq7AQAAZmSqa2YAAAB+jjADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMjTADAABMzaVhZuvWrRo8eLACAwNlsVi0du1au+2GYSghIUGBgYHy9PRUZGSkDh486JpmAQCAW3JpmLlw4YJCQ0OVkpJyw+3z5s3TggULlJKSoszMTPn7+6tfv34qLi6u4k4BAIC78nBl8aioKEVFRd1wm2EYWrhwoWbOnKno6GhJ0vLly+Xn56eVK1fq6aefrspWAQCAm3Lba2Zyc3OVn5+v/v3728asVqsiIiK0Y8eOm76upKRERUVFdgsAAKi+3DbM5OfnS5L8/Pzsxv38/GzbbiQpKUk+Pj62JSgoyKl9AgAA13LbMHONxWKxWzcMo9zY9aZPn67CwkLbkpeX5+wWAQCAC7n0mplb8ff3l/TTDE1AQIBtvKCgoNxszfWsVqusVqvT+wMAAO7BbWdmmjdvLn9/f6WlpdnGLl++rIyMDIWHh7uwMwAA4E5cOjNz/vx5HTt2zLaem5urrKwsNWjQQE2bNtWkSZOUmJioli1bqmXLlkpMTFSdOnUUExPjwq4BAIA7cWmY2bNnj3r37m1bj4+PlySNHj1ab7/9tp577jldunRJ48aN09mzZ9W1a1dt3rxZXl5ermoZAAC4GZeGmcjISBmGcdPtFotFCQkJSkhIqLqm8KvTbNr6KqlzInlQldQBgF8bt71mBgAAoCIIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQIMwAAwNQ8XN0AgOqn2bT1VVLnRPKgKqkDwL0xMwMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEzNrcNMQkKCLBaL3eLv7+/qtgAAgBtx+6dmt2/fXp988oltvUaNGi7sBgAAuBu3DzMeHh7MxgAAgJty69NMkpSTk6PAwEA1b95cjzzyiI4fP37L/UtKSlRUVGS3AACA6sutw0zXrl21YsUKpaam6s0331R+fr7Cw8N15syZm74mKSlJPj4+tiUoKKgKOwYAAFXNrcNMVFSUHn74YXXo0EF9+/bV+vXrJUnLly+/6WumT5+uwsJC25KXl1dV7QIAABdw+2tmrle3bl116NBBOTk5N93HarXKarVWYVcAAMCV3Hpm5udKSkp0+PBhBQQEuLoVAADgJtw6zDz77LPKyMhQbm6udu3apT/84Q8qKirS6NGjXd0aAABwE259munUqVN69NFH9f333+uee+5Rt27dtHPnTgUHB7u6NQAA4CbcOsysWrXK1S0AAAA359anmQAAAG6HMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEyNMAMAAEzNrR80iV+nZtPWO73GieRBTq8BAKgazMwAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTI8wAAABTM0WYee2119S8eXPVrl1bXbp00bZt21zdEgAAcBMerm7gdlavXq1JkybptddeU48ePfTGG28oKipKhw4dUtOmTV3dXpVrNm2902ucSB5UpfV+XhMAAEe4fZhZsGCBHn/8cT3xxBOSpIULFyo1NVWLFy9WUlKSi7sD4A4I3cCvm1uHmcuXL2vv3r2aNm2a3Xj//v21Y8eOG76mpKREJSUltvXCwkJJUlFRkVN6DJmV6pTjXu8/Lw6w/bms5KLT613/s6qKeq6o6cr3yM+08mu64mcKwLmu/b4ZhnH7nQ039s033xiSjM8++8xufM6cOUarVq1u+JpZs2YZklhYWFhYWFiqwZKXl3fbvODWMzPXWCwWu3XDMMqNXTN9+nTFx8fb1svKyvTDDz+oYcOGN31NVSkqKlJQUJDy8vLk7e1dLWtW93quqFnd67miJu/R/PVcUbO613NVzZsxDEPFxcUKDAy87b5uHWYaNWqkGjVqKD8/3268oKBAfn5+N3yN1WqV1Wq1G6tfv76zWrwj3t7eVf4/SVXXrO71XFGzutdzRU3eo/nruaJmda/nqpo34uPjU6H93Pqr2bVq1VKXLl2UlpZmN56Wlqbw8HAXdQUAANyJW8/MSFJ8fLxGjRqlsLAwde/eXUuWLNHXX3+tsWPHuro1AADgBtw+zIwYMUJnzpzR7Nmzdfr0aYWEhGjDhg0KDg52dWsOs1qtmjVrVrnTYNWpZnWv54qa1b2eK2ryHs1fzxU1q3s9V9WsDBbDqMh3ngAAANyTW18zAwAAcDuEGQAAYGqEGQAAYGqEGQAAYGqEmSqwdetWDR48WIGBgbJYLFq7dq1T6yUlJen++++Xl5eXfH199dBDD+nIkSNOrbl48WJ17NjRdqOl7t27a+PGjU6teb2kpCRZLBZNmjTJKcdPSEiQxWKxW/z9/Z1S63rffPON/vSnP6lhw4aqU6eOOnXqpL179zqlVrNmzcq9R4vFori4OKfUu3r1qv7nf/5HzZs3l6enp+69917Nnj1bZWVlTql3TXFxsSZNmqTg4GB5enoqPDxcmZmZlXLs2/2uG4ahhIQEBQYGytPTU5GRkTp48KBTa3744YcaMGCAGjVqJIvFoqysLKfVu3Llip5//nl16NBBdevWVWBgoB577DF9++23Tqkn/fS72aZNG9WtW1d33323+vbtq127dt1xvYrUvN7TTz8ti8WihQsXOq1ebGxsud/Lbt26Oa2eJB0+fFhDhgyRj4+PvLy81K1bN3399dd3XNPZCDNV4MKFCwoNDVVKSkqV1MvIyFBcXJx27typtLQ0Xb16Vf3799eFCxecVrNJkyZKTk7Wnj17tGfPHvXp00dDhw79xR/UFZGZmaklS5aoY8eOTq3Tvn17nT592rZkZ2c7td7Zs2fVo0cP1axZUxs3btShQ4c0f/58p93ROjMz0+79XbtZ5R//+Een1Js7d65ef/11paSk6PDhw5o3b57+93//V6+88opT6l3zxBNPKC0tTe+8846ys7PVv39/9e3bV998880vPvbtftfnzZunBQsWKCUlRZmZmfL391e/fv1UXFzstJoXLlxQjx49lJycfMc1Klrv4sWL2rdvn1544QXt27dPH374oY4ePaohQ4Y4pZ4ktWrVSikpKcrOztb27dvVrFkz9e/fX//973+dVvOatWvXateuXRW63f4vrTdw4EC7388NGzY4rd5XX32lnj17qk2bNkpPT9cXX3yhF154QbVr177jmk73Sx8GCcdIMtasWVOlNQsKCgxJRkZGRpXWvfvuu4233nrLqTWKi4uNli1bGmlpaUZERIQxceJEp9SZNWuWERoa6pRj38zzzz9v9OzZs0prXm/ixInGfffdZ5SVlTnl+IMGDTLGjBljNxYdHW386U9/cko9wzCMixcvGjVq1DA+/vhju/HQ0FBj5syZlVrr57/rZWVlhr+/v5GcnGwb+/HHHw0fHx/j9ddfd0rN6+Xm5hqSjP3791dKrdvVu2b37t2GJOPkyZNVUq+wsNCQZHzyySe/uN6tap46dcpo3Lix8Z///McIDg42Xn75ZafVGz16tDF06NBKOX5F6o0YMcKpv4fOwMzMr0BhYaEkqUGDBlVSr7S0VKtWrdKFCxfUvXt3p9aKi4vToEGD1LdvX6fWkaScnBwFBgaqefPmeuSRR3T8+HGn1lu3bp3CwsL0xz/+Ub6+vurcubPefPNNp9a85vLly3r33Xc1ZswYpz2gtWfPnvr3v/+to0ePSpK++OILbd++XQ8++KBT6kk/ndoqLS0t9y9MT09Pbd++3Wl1JSk3N1f5+fnq37+/bcxqtSoiIkI7duxwam1XKiwslMViqZJn5F2+fFlLliyRj4+PQkNDnVanrKxMo0aN0tSpU9W+fXun1bleenq6fH191apVKz355JMqKChwSp2ysjKtX79erVq10oABA+Tr66uuXbs6/fKIX4owU80ZhqH4+Hj17NlTISEhTq2VnZ2tevXqyWq1auzYsVqzZo3atWvntHqrVq3Svn37lJSU5LQa13Tt2lUrVqxQamqq3nzzTeXn5ys8PFxnzpxxWs3jx49r8eLFatmypVJTUzV27FhNmDBBK1ascFrNa9auXatz584pNjbWaTWef/55Pfroo2rTpo1q1qypzp07a9KkSXr00UedVtPLy0vdu3fXSy+9pG+//ValpaV69913tWvXLp0+fdppdSXZHpj784fk+vn5lXuYbnXx448/atq0aYqJiXHqQws//vhj1atXT7Vr19bLL7+stLQ0NWrUyGn15s6dKw8PD02YMMFpNa4XFRWl9957T1u2bNH8+fOVmZmpPn36qKSkpNJrFRQU6Pz580pOTtbAgQO1efNmDRs2TNHR0crIyKj0epXF7R9ngF9m/PjxOnDggNP/1SlJrVu3VlZWls6dO6cPPvhAo0ePVkZGhlMCTV5eniZOnKjNmzdXyXncqKgo2587dOig7t2767777tPy5csVHx/vlJplZWUKCwtTYmKiJKlz5846ePCgFi9erMcee8wpNa9ZunSpoqKifvG1ALeyevVqvfvuu1q5cqXat2+vrKwsTZo0SYGBgRo9erTT6r7zzjsaM2aMGjdurBo1aug3v/mNYmJitG/fPqfVvN7PZ7oMw3Da7JcrXblyRY888ojKysr02muvObVW7969lZWVpe+//15vvvmmhg8frl27dsnX17fSa+3du1eLFi3Svn37quy/24gRI2x/DgkJUVhYmIKDg7V+/XpFR0dXaq1rF+APHTpUkydPliR16tRJO3bs0Ouvv66IiIhKrVdZmJmpxp555hmtW7dOn376qZo0aeL0erVq1VKLFi0UFhampKQkhYaGatGiRU6ptXfvXhUUFKhLly7y8PCQh4eHMjIy9Pe//10eHh4qLS11St1r6tatqw4dOignJ8dpNQICAsoFwbZt2zr9GwUnT57UJ598oieeeMKpdaZOnapp06bpkUceUYcOHTRq1ChNnjzZ6TNt9913nzIyMnT+/Hnl5eVp9+7dunLlipo3b+7Uute+/fbzWZiCgoJyszVmd+XKFQ0fPly5ublKS0tz6qyM9NPvY4sWLdStWzctXbpUHh4eWrp0qVNqbdu2TQUFBWratKnts+fkyZOaMmWKmjVr5pSaPxcQEKDg4GCnfP40atRIHh4eLvns+SUIM9WQYRgaP368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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(max, inconsistent=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the expectation of partition sizes over 1,391 targets; inconsistent guesses allowed\n",
      "first guess: \"SOUTH\"\n",
      "median: 6 guesses, mean: 6.13 ± 0.89, worst: 9, best: 1\n",
      "cumulative: ≤2:0%, ≤3:1%, ≤4:4%, ≤5:19%, ≤6:66%, ≤7:97%, ≤8:99.9%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 5.38 s, sys: 173 ms, total: 5.55 s\n",
      "Wall time: 4.66 s\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGwCAYAAABcnuQpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxfElEQVR4nO3deXRN9/7/8dchElPEVBkMMcUYQmkRKtoSVRdtei9tXKU68EWJaFrq269UKwnfa2qDVuuig7Lut6hqDelFirRESKkaKzRKmltTYmiQ7N8fXc5PGkMOOTn5pM/HWnst+7PP2e/3Oe05Xj57ODbLsiwBAAAYqoyrGwAAALgbhBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKO5uboBZ8vLy9OJEyfk6ekpm83m6nYAAEAhWJal7Oxs+fn5qUyZW8+9lPowc+LECdWtW9fVbQAAgDuQnp6uOnXq3PIxpT7MeHp6Svr9zahSpYqLuwEAAIWRlZWlunXr2v8ev5VSH2auHVqqUqUKYQYAAMMU5hQRTgAGAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGM3N1Q0Afzb1x39RLHWOxvUuljoA4GrMzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxWYsJMbGysbDabIiIi7GOWZSk6Olp+fn6qUKGCunXrpr1797quSQAAUOKUiDCTnJys+fPnq3Xr1vnGp02bphkzZig+Pl7Jycny8fFRjx49lJ2d7aJOAQBASePyMHP+/HkNHDhQ7733nqpVq2YftyxLs2bN0sSJExUWFqbAwEAtXrxYFy9e1JIlS266v5ycHGVlZeVbAABA6eXyMDNy5Ej17t1b3bt3zzeelpamjIwMhYaG2sc8PDwUEhKipKSkm+4vNjZWXl5e9qVu3bpO6x0AALieS8PM0qVLtXPnTsXGxhbYlpGRIUny9vbON+7t7W3fdiMTJkzQuXPn7Et6enrRNg0AAEoUN1cVTk9P15gxY7R+/XqVL1/+po+z2Wz51i3LKjB2PQ8PD3l4eBRZnwAAoGRz2cxMSkqKMjMz1a5dO7m5ucnNzU2JiYl666235ObmZp+R+eMsTGZmZoHZGgAA8OflsjDz8MMPa8+ePUpNTbUv7du318CBA5WamqqGDRvKx8dHCQkJ9udcvnxZiYmJCg4OdlXbAACghHHZYSZPT08FBgbmG6tUqZJq1KhhH4+IiFBMTIwCAgIUEBCgmJgYVaxYUeHh4a5oGQAAlEAuCzOF8fLLL+vSpUsaMWKEzpw5ow4dOmj9+vXy9PR0dWsAAKCEsFmWZbm6CWfKysqSl5eXzp07pypVqri6HUD1x39RLHWOxvUuljoA4AyO/P3t8vvMAAAA3A3CDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGc3N1AwCcr/74L5xe42hcb6fXAIAbYWYGAAAYjTADAACM5tIwM2/ePLVu3VpVqlRRlSpV1KlTJ61Zs8a+3bIsRUdHy8/PTxUqVFC3bt20d+9eF3YMAABKGpeGmTp16iguLk47duzQjh079NBDD6lfv372wDJt2jTNmDFD8fHxSk5Olo+Pj3r06KHs7GxXtg0AAEoQl4aZPn366NFHH1WTJk3UpEkTTZkyRZUrV9a3334ry7I0a9YsTZw4UWFhYQoMDNTixYt18eJFLVmy5Kb7zMnJUVZWVr4FAACUXiXmnJnc3FwtXbpUFy5cUKdOnZSWlqaMjAyFhobaH+Ph4aGQkBAlJSXddD+xsbHy8vKyL3Xr1i2O9gEAgIu4PMzs2bNHlStXloeHh4YPH64VK1aoRYsWysjIkCR5e3vne7y3t7d9241MmDBB586dsy/p6elO7R8AALiWy+8z07RpU6Wmpurs2bP69NNPNXjwYCUmJtq322y2fI+3LKvA2PU8PDzk4eHhtH4BAEDJUiQzM2fPnr3j57q7u6tx48Zq3769YmNjFRQUpNmzZ8vHx0eSCszCZGZmFpitAQAAf14Oh5mpU6dq2bJl9vX+/furRo0aql27tr777ru7bsiyLOXk5KhBgwby8fFRQkKCfdvly5eVmJio4ODgu64DAABKB4fDzLvvvms/qTYhIUEJCQlas2aNevXqpaioKIf29eqrr2rz5s06evSo9uzZo4kTJ2rTpk0aOHCgbDabIiIiFBMToxUrVuj777/XkCFDVLFiRYWHhzvaNgAAKKUcPmfm5MmT9jCzevVq9e/fX6Ghoapfv746dOjg0L5++eUXDRo0SCdPnpSXl5dat26ttWvXqkePHpKkl19+WZcuXdKIESN05swZdejQQevXr5enp6ejbQMAgFLK4TBTrVo1paenq27dulq7dq3efPNNSb8fHsrNzXVoXwsWLLjldpvNpujoaEVHRzvaJgAA+JNwOMyEhYUpPDxcAQEBOnXqlHr16iVJSk1NVePGjYu8QQAAgFtxOMzMnDlT9evXV3p6uqZNm6bKlStL+v3w04gRI4q8QQAAgFtxOMyUK1dOL730UoHxiIiIougHAADAIXd0n5kPP/xQXbp0kZ+fn44dOyZJmjVrlj777LMibQ4AAOB2HA4z8+bNU2RkpHr16qWzZ8/aT/qtWrWqZs2aVdT9AQAA3JLDYebtt9/We++9p4kTJ6ps2bL28fbt22vPnj1F2hwAAMDtOBxm0tLS1LZt2wLjHh4eunDhQpE0BQAAUFgOh5kGDRooNTW1wPiaNWvUokWLougJAACg0By+mikqKkojR47Ub7/9JsuytH37dn3yySeKjY3V+++/74weAQAAbsrhMPPMM8/o6tWrevnll3Xx4kWFh4erdu3amj17tp588kln9AgAAHBTDoWZq1ev6uOPP1afPn30/PPP69dff1VeXp5q1arlrP4AAABuyaFzZtzc3PRf//VfysnJkSTVrFmTIAMAAFzK4ROAO3TooF27djmjFwAAAIc5fM7MiBEjNG7cOB0/flzt2rVTpUqV8m1v3bp1kTUHAABwOw6HmQEDBkiSRo8ebR+z2WyyLEs2m81+R2AAAIDi4HCYSUtLc0YfAAAAd8ThMOPv7++MPgAAAO6Iw2FGkn788UfNmjVL+/btk81mU/PmzTVmzBg1atSoqPsDAAC4JYevZlq3bp1atGih7du3q3Xr1goMDNS2bdvUsmVLJSQkOKNHAACAm3J4Zmb8+PEaO3as4uLiCoy/8sor6tGjR5E1BwAAcDsOz8zs27dPzz77bIHxoUOH6ocffiiSpgAAAArL4TBzzz333PBXs1NTU7kbMAAAKHYOH2Z6/vnn9cILL+jIkSMKDg6WzWbTli1bNHXqVI0bN84ZPQIAANyUw2Hmtddek6enp6ZPn64JEyZIkvz8/BQdHZ3vRnoAAADFweEwY7PZNHbsWI0dO1bZ2dmSJE9PzyJvDAAAoDDu6A7AV69eVUBAQL4Qc+jQIZUrV07169cvyv4AAABuyeETgIcMGaKkpKQC49u2bdOQIUOKoicAAIBCczjM7Nq1S507dy4w3rFjxxte5QQAAOBMDocZm81mP1fmeufOneMXswEAQLFzOMw88MADio2NzRdccnNzFRsbqy5duhRpcwAAALfj8AnA06ZNU9euXdW0aVM98MADkqTNmzcrKytLGzZsKPIGAQAAbsXhmZkWLVpo9+7d6t+/vzIzM5Wdna2nn35a+/fvV2BgoDN6BAAAuCmHZ2ak32+SFxMTU9S9AAAAOMzhmZm1a9dqy5Yt9vU5c+aoTZs2Cg8P15kzZ4q0OQAAgNtxOMxERUUpKytLkrRnzx5FRkbq0Ucf1ZEjRxQZGVnkDQIAANzKHd0BuEWLFpKkTz/9VH369FFMTIx27typRx99tMgbBAAAuBWHZ2bc3d118eJFSdJXX32l0NBQSVL16tXtMzYAAADFxeGZmS5duigyMlKdO3fW9u3btWzZMknSwYMHVadOnSJvEAAA4FYcnpmJj4+Xm5ub/u///k/z5s1T7dq1JUlr1qzRI488UuQNAgAA3IrDMzP16tXT6tWrC4zPnDmzSBoCAABwhMMzMwAAACUJYQYAABiNMAMAAIxWqDCze/du5eXlObsXAAAAhxUqzLRt21a//vqrJKlhw4Y6deqUU5sCAAAorEKFmapVqyotLU2SdPToUWZpAABAiVGoS7OfeOIJhYSEyNfXVzabTe3bt1fZsmVv+NgjR44UaYMAAAC3UqgwM3/+fIWFhenw4cMaPXq0nn/+eXl6ejq7NwAAgNsq9E3zrt3dNyUlRWPGjCHMAACAEsHhOwAvXLjQ/ufjx4/LZrPZf9IAAACguDl8n5m8vDxNnjxZXl5e8vf3V7169VS1alW98cYbnBgMAACKncMzMxMnTtSCBQsUFxenzp07y7Isbd26VdHR0frtt980ZcoUZ/QJAABwQw6HmcWLF+v9999X37597WNBQUGqXbu2RowYQZgBAADFyuHDTKdPn1azZs0KjDdr1kynT58ukqYAAAAKy+EwExQUpPj4+ALj8fHxCgoKKpKmAAAACsvhw0zTpk1T79699dVXX6lTp06y2WxKSkpSenq6vvzyS2f0CAAAcFMOz8yEhITo4MGDevzxx3X27FmdPn1aYWFhOnDggB544AFn9AgAAHBTDs/MSJKfnx8n+gIAgBLB4ZkZAACAkoQwAwAAjEaYAQAARiPMAAAAo93RCcDX/Prrr9q2bZtyc3N13333ydfXt6j6AgAAKJQ7DjOffvqpnn32WTVp0kRXrlzRgQMHNGfOHD3zzDNF2R8AAMAtFfow0/nz5/Otv/7669q+fbu2b9+uXbt26V//+pcmTpzoUPHY2Fjdd9998vT0VK1atfTYY4/pwIED+R5jWZaio6Pl5+enChUqqFu3btq7d69DdQAAQOlV6DDTrl07ffbZZ/Z1Nzc3ZWZm2td/+eUXubu7O1Q8MTFRI0eO1LfffquEhARdvXpVoaGhunDhgv0x06ZN04wZMxQfH6/k5GT5+PioR48eys7OdqgWAAAonQp9mGndunUaMWKEFi1apDlz5mj27NkaMGCAcnNzdfXqVZUpU0aLFi1yqPjatWvzrS9cuFC1atVSSkqKunbtKsuyNGvWLE2cOFFhYWGSfv/Vbm9vby1ZskTDhg1zqB4AACh9Ch1m6tevry+//FJLlixRSEiIxowZo8OHD+vw4cPKzc1Vs2bNVL58+btq5ty5c5Kk6tWrS5LS0tKUkZGh0NBQ+2M8PDwUEhKipKSkG4aZnJwc5eTk2NezsrLuqicAAFCyOXxpdnh4uP08mW7duikvL09t2rS56yBjWZYiIyPVpUsXBQYGSpIyMjIkSd7e3vke6+3tbd/2R7GxsfLy8rIvdevWvau+AABAyeZQmFmzZo2mT5+ulJQULViwQFOnTlV4eLiioqJ06dKlu2pk1KhR2r17tz755JMC22w2W751y7IKjF0zYcIEnTt3zr6kp6ffVV8AAKBkK3SYefnllzVkyBAlJydr2LBheuONN9StWzft2rVLHh4eatOmjdasWXNHTbz44otatWqVNm7cqDp16tjHfXx8JKnALExmZmaB2ZprPDw8VKVKlXwLAAAovQodZv75z3/qyy+/1NKlS5WcnKwPP/xQkuTu7q4333xTy5cvd/iXtC3L0qhRo7R8+XJt2LBBDRo0yLe9QYMG8vHxUUJCgn3s8uXLSkxMVHBwsEO1AABA6VToMFOxYkWlpaVJktLT0wucI9OyZUtt2bLFoeIjR47URx99pCVLlsjT01MZGRnKyMiwH7Ky2WyKiIhQTEyMVqxYoe+//15DhgxRxYoVFR4e7lAtAABQOhX6aqbY2Fg9/fTTGj16tC5evKjFixffdfF58+ZJkrp165ZvfOHChRoyZIik3w9vXbp0SSNGjNCZM2fUoUMHrV+/Xp6ennddHwAAmK/QYWbgwIF65JFHdOTIEQUEBKhq1ap3XdyyrNs+xmazKTo6WtHR0XddDwAAlD4O/TZTjRo1VKNGDWf1AgAA4DCH7zMDAABQkhBmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNDdXNwC4Wv3xXxRLnaNxvYulDgD82TAzAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGc2mY+frrr9WnTx/5+fnJZrNp5cqV+bZblqXo6Gj5+fmpQoUK6tatm/bu3euaZgEAQInk0jBz4cIFBQUFKT4+/obbp02bphkzZig+Pl7Jycny8fFRjx49lJ2dXcydAgCAksrNlcV79eqlXr163XCbZVmaNWuWJk6cqLCwMEnS4sWL5e3trSVLlmjYsGHF2SoAACihSuw5M2lpacrIyFBoaKh9zMPDQyEhIUpKSrrp83JycpSVlZVvAQAApVeJDTMZGRmSJG9v73zj3t7e9m03EhsbKy8vL/tSt25dp/YJAABcq8SGmWtsNlu+dcuyCoxdb8KECTp37px9SU9Pd3aLAADAhVx6zsyt+Pj4SPp9hsbX19c+npmZWWC25noeHh7y8PBwen8AAKBkKLEzMw0aNJCPj48SEhLsY5cvX1ZiYqKCg4Nd2BkAAChJXDozc/78eR0+fNi+npaWptTUVFWvXl316tVTRESEYmJiFBAQoICAAMXExKhixYoKDw93YdcAAKAkcWmY2bFjhx588EH7emRkpCRp8ODBWrRokV5++WVdunRJI0aM0JkzZ9ShQwetX79enp6ermoZAACUMC4NM926dZNlWTfdbrPZFB0drejo6OJrCgAAGKXEnjMDAABQGIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACMRpgBAABGI8wAAACjEWYAAIDRCDMAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGM3N1Q0Af1R//BdOr3E0rrfTawAAigdhBkCRK45AKhFKAfyOw0wAAMBohBkAAGA0wgwAADAaYQYAABiNMAMAAIxGmAEAAEYjzAAAAKMRZgAAgNEIMwAAwGiEGQAAYDTCDAAAMBphBgAAGI0wAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNCPCzNy5c9WgQQOVL19e7dq10+bNm13dEgAAKCHcXN3A7SxbtkwRERGaO3euOnfurHfffVe9evXSDz/8oHr16rm6vVKv/vgviqXO0bjexVIHAFD6lPgwM2PGDD377LN67rnnJEmzZs3SunXrNG/ePMXGxrq4u+JXHOGCYAEAMEmJDjOXL19WSkqKxo8fn288NDRUSUlJN3xOTk6OcnJy7Ovnzp2TJGVlZTmlx8BJ65yy3+t9/3pP+5/zci46vd7171Vx1HNFTVe+Rt7Toq9ZHJ9DKf9nEYBzXft8W5Z1+wdbJdjPP/9sSbK2bt2ab3zKlClWkyZNbvicSZMmWZJYWFhYWFhYSsGSnp5+27xQomdmrrHZbPnWLcsqMHbNhAkTFBkZaV/Py8vT6dOnVaNGjZs+p7hkZWWpbt26Sk9PV5UqVUplzdJezxU1S3s9V9TkNZpfzxU1S3s9V9W8GcuylJ2dLT8/v9s+tkSHmZo1a6ps2bLKyMjIN56ZmSlvb+8bPsfDw0MeHh75xqpWreqsFu9IlSpViv1/kuKuWdrruaJmaa/nipq8RvPruaJmaa/nqpo34uXlVajHlehLs93d3dWuXTslJCTkG09ISFBwcLCLugIAACVJiZ6ZkaTIyEgNGjRI7du3V6dOnTR//nz99NNPGj58uKtbAwAAJUCJDzMDBgzQqVOnNHnyZJ08eVKBgYH68ssv5e/v7+rWHObh4aFJkyYVOAxWmmqW9nquqFna67miJq/R/HquqFna67mqZlGwWVZhrnkCAAAomUr0OTMAAAC3Q5gBAABGI8wAAACjEWYAAIDRCDPF4Ouvv1afPn3k5+cnm82mlStXOrVebGys7rvvPnl6eqpWrVp67LHHdODAAafWnDdvnlq3bm2/0VKnTp20Zs0ap9a8XmxsrGw2myIiIpyy/+joaNlstnyLj4+PU2pd7+eff9bf//531ahRQxUrVlSbNm2UkpLilFr169cv8BptNptGjhzplHpXr17Vf//3f6tBgwaqUKGCGjZsqMmTJysvL88p9a7Jzs5WRESE/P39VaFCBQUHBys5OblI9n27z7plWYqOjpafn58qVKigbt26ae/evU6tuXz5cvXs2VM1a9aUzWZTamqq0+pduXJFr7zyilq1aqVKlSrJz89PTz/9tE6cOOGUetLvn81mzZqpUqVKqlatmrp3765t27bdcb3C1LzesGHDZLPZNGvWLKfVGzJkSIHPZceOHZ1WT5L27dunvn37ysvLS56enurYsaN++umnO67pbISZYnDhwgUFBQUpPj6+WOolJiZq5MiR+vbbb5WQkKCrV68qNDRUFy5ccFrNOnXqKC4uTjt27NCOHTv00EMPqV+/fnf9RV0YycnJmj9/vlq3bu3UOi1bttTJkyfty549e5xa78yZM+rcubPKlSunNWvW6IcfftD06dOddkfr5OTkfK/v2s0q//a3vzml3tSpU/XOO+8oPj5e+/bt07Rp0/S///u/evvtt51S75rnnntOCQkJ+vDDD7Vnzx6Fhoaqe/fu+vnnn+9637f7rE+bNk0zZsxQfHy8kpOT5ePjox49eig7O9tpNS9cuKDOnTsrLi7ujmsUtt7Fixe1c+dOvfbaa9q5c6eWL1+ugwcPqm/fvk6pJ0lNmjRRfHy89uzZoy1btqh+/foKDQ3Vf/7zH6fVvGblypXatm1boW63f7f1HnnkkXyfzy+//NJp9X788Ud16dJFzZo106ZNm/Tdd9/ptddeU/ny5e+4ptPd7Y9BwjGSrBUrVhRrzczMTEuSlZiYWKx1q1WrZr3//vtOrZGdnW0FBARYCQkJVkhIiDVmzBin1Jk0aZIVFBTklH3fzCuvvGJ16dKlWGteb8yYMVajRo2svLw8p+y/d+/e1tChQ/ONhYWFWX//+9+dUs+yLOvixYtW2bJlrdWrV+cbDwoKsiZOnFiktf74Wc/Ly7N8fHysuLg4+9hvv/1meXl5We+8845Tal4vLS3NkmTt2rWrSGrdrt4127dvtyRZx44dK5Z6586dsyRZX3311V3Xu1XN48ePW7Vr17a+//57y9/f35o5c6bT6g0ePNjq169fkey/MPUGDBjg1M+hMzAz8ydw7tw5SVL16tWLpV5ubq6WLl2qCxcuqFOnTk6tNXLkSPXu3Vvdu3d3ah1JOnTokPz8/NSgQQM9+eSTOnLkiFPrrVq1Su3bt9ff/vY31apVS23bttV7773n1JrXXL58WR999JGGDh3qtB9o7dKli/7973/r4MGDkqTvvvtOW7Zs0aOPPuqUetLvh7Zyc3ML/AuzQoUK2rJli9PqSlJaWpoyMjIUGhpqH/Pw8FBISIiSkpKcWtuVzp07J5vNViy/kXf58mXNnz9fXl5eCgoKclqdvLw8DRo0SFFRUWrZsqXT6lxv06ZNqlWrlpo0aaLnn39emZmZTqmTl5enL774Qk2aNFHPnj1Vq1YtdejQwemnR9wtwkwpZ1mWIiMj1aVLFwUGBjq11p49e1S5cmV5eHho+PDhWrFihVq0aOG0ekuXLtXOnTsVGxvrtBrXdOjQQR988IHWrVun9957TxkZGQoODtapU6ecVvPIkSOaN2+eAgICtG7dOg0fPlyjR4/WBx984LSa16xcuVJnz57VkCFDnFbjlVde0VNPPaVmzZqpXLlyatu2rSIiIvTUU085raanp6c6deqkN954QydOnFBubq4++ugjbdu2TSdPnnRaXUn2H8z944/kent7F/gx3dLit99+0/jx4xUeHu7UHy1cvXq1KleurPLly2vmzJlKSEhQzZo1nVZv6tSpcnNz0+jRo51W43q9evXSxx9/rA0bNmj69OlKTk7WQw89pJycnCKvlZmZqfPnzysuLk6PPPKI1q9fr8cff1xhYWFKTEws8npFpcT/nAHuzqhRo7R7926n/6tTkpo2barU1FSdPXtWn376qQYPHqzExESnBJr09HSNGTNG69evL5bjuL169bL/uVWrVurUqZMaNWqkxYsXKzIy0ik18/Ly1L59e8XExEiS2rZtq71792revHl6+umnnVLzmgULFqhXr153fS7ArSxbtkwfffSRlixZopYtWyo1NVURERHy8/PT4MGDnVb3ww8/1NChQ1W7dm2VLVtW9957r8LDw7Vz506n1bzeH2e6LMty2uyXK125ckVPPvmk8vLyNHfuXKfWevDBB5Wamqpff/1V7733nvr3769t27apVq1aRV4rJSVFs2fP1s6dO4vtv9uAAQPsfw4MDFT79u3l7++vL774QmFhYUVa69oJ+P369dPYsWMlSW3atFFSUpLeeecdhYSEFGm9osLMTCn24osvatWqVdq4caPq1Knj9Hru7u5q3Lix2rdvr9jYWAUFBWn27NlOqZWSkqLMzEy1a9dObm5ucnNzU2Jiot566y25ubkpNzfXKXWvqVSpklq1aqVDhw45rYavr2+BINi8eXOnX1Fw7NgxffXVV3ruueecWicqKkrjx4/Xk08+qVatWmnQoEEaO3as02faGjVqpMTERJ0/f17p6enavn27rly5ogYNGji17rWr3/44C5OZmVlgtsZ0V65cUf/+/ZWWlqaEhASnzspIv38eGzdurI4dO2rBggVyc3PTggULnFJr8+bNyszMVL169ezfPceOHdO4ceNUv359p9T8I19fX/n7+zvl+6dmzZpyc3NzyXfP3SDMlEKWZWnUqFFavny5NmzY4PQv6Vv14YxpUEl6+OGHtWfPHqWmptqX9u3ba+DAgUpNTVXZsmWdUveanJwc7du3T76+vk6r0blz5wKX1B88eNDpP7K6cOFC1apVS71793ZqnYsXL6pMmfxfQWXLlnX6pdnXVKpUSb6+vjpz5ozWrVunfv36ObVegwYN5OPjY79KTPr9HI/ExEQFBwc7tXZxuhZkDh06pK+++ko1atQo9h6c+d0zaNAg7d69O993j5+fn6KiorRu3Tqn1PyjU6dOKT093SnfP+7u7rrvvvtc8t1zNzjMVAzOnz+vw4cP29fT0tKUmpqq6tWrq169ekVeb+TIkVqyZIk+++wzeXp62v8l6OXlpQoVKhR5PUl69dVX1atXL9WtW1fZ2dlaunSpNm3apLVr1zqlnqenZ4FzgCpVqqQaNWo45dygl156SX369FG9evWUmZmpN998U1lZWU49HDJ27FgFBwcrJiZG/fv31/bt2zV//nzNnz/faTXz8vK0cOFCDR48WG5uzv166NOnj6ZMmaJ69eqpZcuW2rVrl2bMmKGhQ4c6te66detkWZaaNm2qw4cPKyoqSk2bNtUzzzxz1/u+3Wc9IiJCMTExCggIUEBAgGJiYlSxYkWFh4c7rebp06f1008/2e/1cu0vKR8fnzu6V9Kt6vn5+emvf/2rdu7cqdWrVys3N9f+/VO9enW5u7sXab0aNWpoypQp6tu3r3x9fXXq1CnNnTtXx48fv6tbCtzuPf1jQCtXrpx8fHzUtGnTIq9XvXp1RUdH64knnpCvr6+OHj2qV199VTVr1tTjjz/ulNcXFRWlAQMGqGvXrnrwwQe1du1aff7559q0adMd1SsWrryU6s9i48aNlqQCy+DBg51S70a1JFkLFy50Sj3LsqyhQ4da/v7+lru7u3XPPfdYDz/8sLV+/Xqn1bsRZ16aPWDAAMvX19cqV66c5efnZ4WFhVl79+51Sq3rff7551ZgYKDl4eFhNWvWzJo/f75T661bt86SZB04cMCpdSzLsrKysqwxY8ZY9erVs8qXL281bNjQmjhxopWTk+PUusuWLbMaNmxoubu7Wz4+PtbIkSOts2fPFsm+b/dZz8vLsyZNmmT5+PhYHh4eVteuXa09e/Y4tebChQtvuH3SpElFXu/a5d83WjZu3Fjk9S5dumQ9/vjjlp+fn+Xu7m75+vpaffv2tbZv335HtQpT80bu9tLsW9W7ePGiFRoaat1zzz1WuXLlrHr16lmDBw+2fvrpJ6fUu2bBggVW48aNrfLly1tBQUHWypUr77hecbBZlmUVVTACAAAobpwzAwAAjEaYAQAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTAD4I4cPXpUNptNqamprm7Fbv/+/erYsaPKly+vNm3auLodAMWEMAMYasiQIbLZbIqLi8s3vnLlStlsNhd15VqTJk1SpUqVdODAAf373/92dTsAiglhBjBY+fLlNXXqVJ05c8bVrRSZy5cv3/Fzf/zxR3Xp0kX+/v4u+bVmAK5BmAEM1r17d/n4+Cg2Nvamj4mOji5wyGXWrFmqX7++fX3IkCF67LHHFBMTI29vb1WtWlWvv/66rl69qqioKFWvXl116tTRP//5zwL7379/v4KDg1W+fHm1bNmywC/r/vDDD3r00UdVuXJleXt7a9CgQfr111/t27t166ZRo0YpMjJSNWvWVI8ePW74OvLy8jR58mTVqVNHHh4eatOmTb5fZbfZbEpJSdHkyZNls9kUHR19w/1kZ2dr4MCBqlSpknx9fTVz5kx169ZNERER+fa1cuXKfM+rWrWqFi1aZF//+eefNWDAAFWrVk01atRQv379dPToUfv2TZs26f7771elSpVUtWpVde7cWceOHZMkfffdd3rwwQfl6empKlWqqF27dtqxY4f9uUlJSeratasqVKigunXravTo0bpw4YJ9+9y5cxUQEKDy5cvL29tbf/3rX2/4WoE/C8IMYLCyZcsqJiZGb7/9to4fP35X+9qwYYNOnDihr7/+WjNmzFB0dLT+8pe/qFq1atq2bZuGDx+u4cOHKz09Pd/zoqKiNG7cOO3atUvBwcHq27evTp06JUk6efKkQkJC1KZNG+3YsUNr167VL7/8ov79++fbx+LFi+Xm5qatW7fq3XffvWF/s2fP1vTp0/WPf/xDu3fvVs+ePdW3b18dOnTIXqtly5YaN26cTp48qZdeeumG+4mMjNTWrVu1atUqJSQkaPPmzdq5c6dD79XFixf14IMPqnLlyvr666+1ZcsWVa5cWY888oguX76sq1ev6rHHHlNISIh2796tb775Ri+88IL98N/AgQNVp04dJScnKyUlRePHj1e5cuUkSXv27FHPnj0VFham3bt3a9myZdqyZYtGjRolSdqxY4dGjx6tyZMn68CBA1q7dq26du3qUP9AqePqn+0GcGcGDx5s9evXz7Isy+rYsaM1dOhQy7Isa8WKFdb1H+1JkyZZQUFB+Z47c+ZMy9/fP9++/P39rdzcXPtY06ZNrQceeMC+fvXqVatSpUrWJ598YlmWZaWlpVmSrLi4OPtjrly5YtWpU8eaOnWqZVmW9dprr1mhoaH5aqenp1uSrAMHDliWZVkhISFWmzZtbvt6/fz8rClTpuQbu++++6wRI0bY14OCgqxJkybddB9ZWVlWuXLlrH/961/2sbNnz1oVK1a0xowZYx+TZK1YsSLfc728vKyFCxdalmVZCxYssJo2bWrl5eXZt+fk5FgVKlSw1q1bZ506dcqSZG3atOmGfXh6elqLFi264bZBgwZZL7zwQr6xzZs3W2XKlLEuXbpkffrpp1aVKlWsrKysm75O4M+GmRmgFJg6daoWL16sH3744Y730bJlS5Up8/+/Ery9vdWqVSv7etmyZVWjRg1lZmbme16nTp3sf3Zzc1P79u21b98+SVJKSoo2btyoypUr25dmzZpJ+v38lmvat29/y96ysrJ04sQJde7cOd94586d7bUK48iRI7py5Yruv/9++5iXl5eaNm1a6H1Iv7+uw4cPy9PT0/66qlevrt9++00//vijqlevriFDhqhnz57q06ePZs+erZMnT9qfHxkZqeeee07du3dXXFxcvvciJSVFixYtyvee9ezZU3l5eUpLS1OPHj3k7++vhg0batCgQfr444918eJFh/oHShvCDFAKdO3aVT179tSrr75aYFuZMmVkWVa+sStXrhR43LXDHNfYbLYbjuXl5d22n2uHU/Ly8tSnTx+lpqbmWw4dOpTv0EilSpVuu8/r93uNZVkOXbl17X240X7+WOdW71leXp7atWtX4HUdPHhQ4eHhkqSFCxfqm2++UXBwsJYtW6YmTZro22+/lfT7eUx79+5V7969tWHDBrVo0UIrVqyw73vYsGH59vvdd9/p0KFDatSokTw9PbVz50598skn8vX11f/8z/8oKChIZ8+eLfT7AJQ2hBmglIiLi9Pnn3+upKSkfOP33HOPMjIy8v3lXJT3hrn2F7QkXb16VSkpKfbZl3vvvVd79+5V/fr11bhx43xLYQOMJFWpUkV+fn7asmVLvvGkpCQ1b9680Ptp1KiRypUrp+3bt9vHsrKy7OfdXHPPPffkm0k5dOhQvtmPe++9V4cOHVKtWrUKvC4vLy/749q2basJEyYoKSlJgYGBWrJkiX1bkyZNNHbsWK1fv15hYWFauHChfd979+4tsN/GjRvL3d1d0u8zYN27d9e0adO0e/duHT16VBs2bCj0+wCUNoQZoJRo1aqVBg4cqLfffjvfeLdu3fSf//xH06ZN048//qg5c+ZozZo1RVZ3zpw5WrFihfbv36+RI0fqzJkzGjp0qCRp5MiROn36tJ566ilt375dR44c0fr16zV06FDl5uY6VCcqKkpTp07VsmXLdODAAY0fP16pqakaM2ZMoffh6empwYMHKyoqShs3btTevXs1dOhQlSlTJt9szUMPPaT4+Hjt3LlTO3bs0PDhw/PNUg0cOFA1a9ZUv379tHnzZqWlpSkxMVFjxozR8ePHlZaWpgkTJuibb77RsWPHtH79eh08eFDNmzfXpUuXNGrUKG3atEnHjh3T1q1blZycbA9lr7zyir755huNHDnSPou1atUqvfjii5Kk1atX66233lJqaqqOHTumDz74QHl5eQ4fKgNKE8IMUIq88cYbBQ6PNG/eXHPnztWcOXMUFBSk7du33/RKnzsRFxenqVOnKigoSJs3b9Znn32mmjVrSpL8/Py0detW5ebmqmfPngoMDNSYMWPk5eWV7/ycwhg9erTGjRuncePGqVWrVlq7dq1WrVqlgIAAh/YzY8YMderUSX/5y1/UvXt3de7cWc2bN1f58uXtj5k+fbrq1q2rrl27Kjw8XC+99JIqVqxo316xYkV9/fXXqlevnsLCwtS8eXMNHTpUly5dUpUqVVSxYkXt379fTzzxhJo0aaIXXnhBo0aN0rBhw1S2bFmdOnVKTz/9tJo0aaL+/furV69eev311yVJrVu3VmJiog4dOqQHHnhAbdu21WuvvSZfX19Jv18ivnz5cj300ENq3ry53nnnHX3yySdq2bKlQ+8DUJrYrD9+8wHAn8iFCxdUu3ZtTZ8+Xc8++6yr2wFwB9xc3QAAFKddu3Zp//79uv/++3Xu3DlNnjxZktSvXz8XdwbgThFmAPzp/OMf/9CBAwfk7u6udu3aafPmzfZDYwDMw2EmAABgNE4ABgAARiPMAAAAoxFmAACA0QgzAADAaIQZAABgNMIMAAAwGmEGAAAYjTADAACM9v8AltccXSmonbkAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(expectation, inconsistent=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "minimizing the neg_entropy of partition sizes over 1,391 targets; inconsistent guesses allowed\n",
      "first guess: \"STARE\"\n",
      "median: 6 guesses, mean: 6.18 ± 0.93, worst: 9, best: 1\n",
      "cumulative: ≤2:0%, ≤3:1%, ≤4:3%, ≤5:20%, ≤6:63%, ≤7:95%, ≤8:99.7%, ≤9:100%, ≤10:100%\n",
      "CPU times: user 6.17 s, sys: 207 ms, total: 6.37 s\n",
      "Wall time: 4.87 s\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGwCAYAAABcnuQpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8o6BhiAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAxkklEQVR4nO3deXRN9/7/8dchMoiIqTIYYooxhEqLUElborho03tp4yrVgYsSUUp9faV6JeF7TbdBS110UNb9FlWtIb0qaFpiSPmaVWiU3NyaEkODZP/+6HJ+0hhyyM7JTp+PtfZa9mefs9/vc9pzvHzOHmyGYRgCAACwqHLObgAAAOBBEGYAAIClEWYAAIClEWYAAIClEWYAAIClEWYAAIClEWYAAICluTi7AbPl5+fr9OnT8vLyks1mc3Y7AACgCAzDUE5Ojvz9/VWu3N3nXsp8mDl9+rTq1Knj7DYAAMB9yMjIUO3ate/6mDIfZry8vCT9+mZUrlzZyd0AAICiyM7OVp06dex/j99NmQ8zN39aqly5MmEGAACLKcohIhwADAAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALI0wAwAALM3F2Q0Avzf1xn9RInVOJPQskToA4GzMzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsjzAAAAEsrNWEmPj5eNptN0dHR9jHDMBQbGyt/f395eHgoPDxc+/fvd16TAACg1CkVYSY1NVULFixQq1atCoxPnz5dM2fOVGJiolJTU+Xr66uuXbsqJyfHSZ0CAIDSxulh5tKlS+rfv78WLlyoqlWr2scNw9Ds2bM1ceJERUZGKigoSEuXLtWVK1e0bNkyJ3YMAABKE6eHmeHDh6tnz57q0qVLgfH09HRlZmYqIiLCPubm5qawsDClpKTccX+5ubnKzs4usAAAgLLLxZnFly9frt27dys1NbXQtszMTEmSj49PgXEfHx+dPHnyjvuMj4/XW2+9VbyNAgCAUstpMzMZGRkaNWqUPvroI7m7u9/xcTabrcC6YRiFxm41YcIEXbx40b5kZGQUW88AAKD0cdrMzK5du5SVlaW2bdvax/Ly8rRlyxYlJibq8OHDkn6dofHz87M/Jisrq9Bsza3c3Nzk5uZmXuMAAKBUcdrMzJNPPql9+/YpLS3NvoSEhKh///5KS0tTgwYN5Ovrq6SkJPtzrl27puTkZIWGhjqrbQAAUMo4bWbGy8tLQUFBBcY8PT1VvXp1+3h0dLTi4uIUGBiowMBAxcXFqWLFioqKinJGywAAoBRy6gHA9zJu3DhdvXpVw4YN0/nz59WuXTtt3LhRXl5ezm4NAACUEjbDMAxnN2Gm7OxseXt76+LFi6pcubKz2wFUb/wXJVLnRELPEqkDAGZw5O9vp19nBgAA4EEQZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKW5OLsBAOarN/4L02ucSOhpeg0AuB1mZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKU5NczMnz9frVq1UuXKlVW5cmV16NBB69ats283DEOxsbHy9/eXh4eHwsPDtX//fid2DAAAShunhpnatWsrISFBO3fu1M6dO/XEE0+oT58+9sAyffp0zZw5U4mJiUpNTZWvr6+6du2qnJwcZ7YNAABKEaeGmV69eqlHjx5q3LixGjdurKlTp6pSpUr67rvvZBiGZs+erYkTJyoyMlJBQUFaunSprly5omXLlt1xn7m5ucrOzi6wAACAsqvUHDOTl5en5cuX6/Lly+rQoYPS09OVmZmpiIgI+2Pc3NwUFhamlJSUO+4nPj5e3t7e9qVOnTol0T4AAHASp4eZffv2qVKlSnJzc9PQoUO1atUqNW/eXJmZmZIkHx+fAo/38fGxb7udCRMm6OLFi/YlIyPD1P4BAIBzuTi7gSZNmigtLU0XLlzQp59+qoEDByo5Odm+3WazFXi8YRiFxm7l5uYmNzc30/oFAACli9NnZlxdXdWoUSOFhIQoPj5ewcHBmjNnjnx9fSWp0CxMVlZWodkaAADw++X0MPNbhmEoNzdX9evXl6+vr5KSkuzbrl27puTkZIWGhjqxQwAAUJo49WemN998U927d1edOnWUk5Oj5cuXa/PmzVq/fr1sNpuio6MVFxenwMBABQYGKi4uThUrVlRUVJQz2wYAAKWIU8PMv//9bw0YMEBnzpyRt7e3WrVqpfXr16tr166SpHHjxunq1asaNmyYzp8/r3bt2mnjxo3y8vJyZtsAAKAUcWqYWbRo0V2322w2xcbGKjY2tmQaAgAAllPqjpkBAABwBGEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYWrGEmQsXLhTHbgAAABzmcJiZNm2aVqxYYV/v27evqlevrlq1aun7778v1uYAAADuxeEw895776lOnTqSpKSkJCUlJWndunXq3r27xo4dW+wNAgAA3I2Lo084c+aMPcysXbtWffv2VUREhOrVq6d27doVe4MAAAB34/DMTNWqVZWRkSFJWr9+vbp06SJJMgxDeXl5xdsdAADAPTg8MxMZGamoqCgFBgbq7Nmz6t69uyQpLS1NjRo1KvYGAQAA7sbhMDNr1izVq1dPGRkZmj59uipVqiTp15+fhg0bVuwNAgAA3I3DYaZChQp6/fXXC41HR0cXRz8AAAAOua/rzHz44Yfq1KmT/P39dfLkSUnS7Nmz9dlnnxVrcwAAAPficJiZP3++YmJi1L17d124cMF+0G+VKlU0e/bs4u4PAADgrhwOM++8844WLlyoiRMnqnz58vbxkJAQ7du3r1ibAwAAuBeHw0x6erratGlTaNzNzU2XL18ulqYAAACKyuEwU79+faWlpRUaX7dunZo3b14cPQEAABSZw2czjR07VsOHD9cvv/wiwzC0Y8cOffLJJ4qPj9f7779vRo8AAAB35HCYefHFF3Xjxg2NGzdOV65cUVRUlGrVqqU5c+boueeeM6NHAACAO3IozNy4cUMff/yxevXqpVdeeUU///yz8vPzVbNmTbP6AwAAuCuHjplxcXHRX/7yF+Xm5kqSatSoQZABAABO5fABwO3atdOePXvM6AUAAMBhDh8zM2zYMI0ZM0anTp1S27Zt5enpWWB7q1atiq05AACAe3E4zPTr10+SNHLkSPuYzWaTYRiy2Wz2KwIDAACUBIfDTHp6uhl9AAAA3BeHw0xAQIAZfQAAANwXh8OMJP3www+aPXu2Dh48KJvNpmbNmmnUqFFq2LBhcfcHAABwVw6fzbRhwwY1b95cO3bsUKtWrRQUFKTt27erRYsWSkpKMqNHAACAO3J4Zmb8+PEaPXq0EhISCo2/8cYb6tq1a7E1BwAAcC8Oz8wcPHhQL730UqHxwYMH68CBA8XSFAAAQFE5HGYeeuih2941Oy0tjasBAwCAEufwz0yvvPKKXn31VR0/flyhoaGy2Wzatm2bpk2bpjFjxpjRIwAAwB05HGYmTZokLy8vzZgxQxMmTJAk+fv7KzY2tsCF9AAAAEqCw2HGZrNp9OjRGj16tHJyciRJXl5exd4YAABAUdzXFYBv3LihwMDAAiHm6NGjqlChgurVq1ec/QEAANyVwwcADxo0SCkpKYXGt2/frkGDBhVHTwAAAEXmcJjZs2ePOnbsWGi8ffv2tz3LCQAAwEwOhxmbzWY/VuZWFy9e5I7ZAACgxDkcZh577DHFx8cXCC55eXmKj49Xp06dirU5AACAe3H4AODp06erc+fOatKkiR577DFJ0tatW5Wdna1NmzYVe4MAAAB34/DMTPPmzbV371717dtXWVlZysnJ0QsvvKBDhw4pKCjIjB4BAADuyOGZGenXi+TFxcUVdy8AAAAOc3hmZv369dq2bZt9fe7cuWrdurWioqJ0/vz5Ym0OAADgXhwOM2PHjlV2drYkad++fYqJiVGPHj10/PhxxcTEFHuDAAAAd3NfVwBu3ry5JOnTTz9Vr169FBcXp927d6tHjx7F3iAAAMDdODwz4+rqqitXrkiSvvrqK0VEREiSqlWrZp+xAQAAKCkOz8x06tRJMTEx6tixo3bs2KEVK1ZIko4cOaLatWsXe4MAAAB34/DMTGJiolxcXPS///u/mj9/vmrVqiVJWrdunZ566qlibxAAAOBuHJ6ZqVu3rtauXVtofNasWcXSEAAAgCMcnpkBAAAoTQgzAADA0ggzAADA0ooUZvbu3av8/HyzewEAAHBYkcJMmzZt9PPPP0uSGjRooLNnz5raFAAAQFEVKcxUqVJF6enpkqQTJ04wSwMAAEqNIp2a/eyzzyosLEx+fn6y2WwKCQlR+fLlb/vY48ePF2uDAAAAd1OkMLNgwQJFRkbq2LFjGjlypF555RV5eXmZ3RsAAMA9FfmieTev7rtr1y6NGjWKMAMAAEoFh68AvHjxYvufT506JZvNZr+lAQAAQElz+Doz+fn5mjJliry9vRUQEKC6deuqSpUqevvttzkwGAAAlDiHw8zEiROVmJiohIQE7dmzR7t371ZcXJzeeecdTZo0yaF9xcfH65FHHpGXl5dq1qypp59+WocPHy7wGMMwFBsbK39/f3l4eCg8PFz79+93tG0AAFBGORxmli5dqvfff19/+ctf1KpVKwUHB2vYsGFauHChlixZ4tC+kpOTNXz4cH333XdKSkrSjRs3FBERocuXL9sfM336dM2cOVOJiYlKTU2Vr6+vunbtqpycHEdbBwAAZZDDx8ycO3dOTZs2LTTetGlTnTt3zqF9rV+/vsD64sWLVbNmTe3atUudO3eWYRiaPXu2Jk6cqMjISEm/hikfHx8tW7ZMQ4YMcbR9AABQxjg8MxMcHKzExMRC44mJiQoODn6gZi5evChJqlatmiQpPT1dmZmZioiIsD/Gzc1NYWFhSklJue0+cnNzlZ2dXWABAABll8MzM9OnT1fPnj311VdfqUOHDrLZbEpJSVFGRoa+/PLL+27EMAzFxMSoU6dOCgoKkiRlZmZKknx8fAo81sfHRydPnrztfuLj4/XWW2/ddx8AAMBaHJ6ZCQsL05EjR/TMM8/owoULOnfunCIjI3X48GE99thj993IiBEjtHfvXn3yySeFttlstgLrhmEUGrtpwoQJunjxon3JyMi4754AAEDp5/DMjCT5+/tr6tSpxdbEa6+9pjVr1mjLli2qXbu2fdzX11fSrzM0fn5+9vGsrKxCszU3ubm5yc3Nrdh6AwAApZvDMzPFyTAMjRgxQitXrtSmTZtUv379Atvr168vX19fJSUl2ceuXbum5ORkhYaGlnS7AACgFLqvmZniMnz4cC1btkyfffaZvLy87MfIeHt7y8PDQzabTdHR0YqLi1NgYKACAwMVFxenihUrKioqypmtAwCAUsKpYWb+/PmSpPDw8ALjixcv1qBBgyRJ48aN09WrVzVs2DCdP39e7dq108aNG7k3FAAAkOTkMGMYxj0fY7PZFBsbq9jYWPMbAgAAlvNAYebnn3/W9u3blZeXp0ceeaTAQboAAAAl4b7DzKeffqqXXnpJjRs31vXr13X48GHNnTtXL774YnH2BwAAcFdFPpvp0qVLBdbfeust7dixQzt27NCePXv0z3/+UxMnTiz2BgEAAO6myGGmbdu2+uyzz+zrLi4uysrKsq//+9//lqura/F2BwAAcA9F/plpw4YNGjZsmJYsWaK5c+dqzpw56tevn/Ly8nTjxg2VK1fO4btmAwAAPKgih5l69erpyy+/1LJlyxQWFqZRo0bp2LFjOnbsmPLy8tS0aVO5u7ub2SsAAEAhDl8BOCoqyn6cTHh4uPLz89W6dWuCDAAAcAqHzmZat26dDhw4oODgYC1atEibN29WVFSUevTooSlTpsjDw8OsPgEAAG6ryDMz48aN06BBg5SamqohQ4bo7bffVnh4uPbs2SM3Nze1bt1a69atM7NXAACAQoocZv7xj3/oyy+/1PLly5WamqoPP/xQkuTq6qq//vWvWrlyZbHeSRsAAKAoihxmKlasqPT0dElSRkZGoWNkWrRooW3bthVvdwAAAPdQ5DATHx+vF154Qf7+/goLC9Pbb79tZl8AAABFUuQDgPv376+nnnpKx48fV2BgoKpUqWJiWwAAAEXj0NlM1atXV/Xq1c3qBQAAwGEOX2cGAACgNCHMAAAASyPMAAAASyPMAAAASyPMAAAAS3PobCagLKo3/osSqXMioWeJ1AGA3xtmZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKURZgAAgKU5Ncxs2bJFvXr1kr+/v2w2m1avXl1gu2EYio2Nlb+/vzw8PBQeHq79+/c7p1kAAFAqOTXMXL58WcHBwUpMTLzt9unTp2vmzJlKTExUamqqfH191bVrV+Xk5JRwpwAAoLRycWbx7t27q3v37rfdZhiGZs+erYkTJyoyMlKStHTpUvn4+GjZsmUaMmTIbZ+Xm5ur3Nxc+3p2dnbxNw4AAEqNUnvMTHp6ujIzMxUREWEfc3NzU1hYmFJSUu74vPj4eHl7e9uXOnXqlES7AADASUptmMnMzJQk+fj4FBj38fGxb7udCRMm6OLFi/YlIyPD1D4BAIBzOfVnpqKw2WwF1g3DKDR2Kzc3N7m5uZndFgAAKCVK7cyMr6+vJBWahcnKyio0WwMAAH6/Sm2YqV+/vnx9fZWUlGQfu3btmpKTkxUaGurEzgAAQGni1J+ZLl26pGPHjtnX09PTlZaWpmrVqqlu3bqKjo5WXFycAgMDFRgYqLi4OFWsWFFRUVFO7BoAAJQmTg0zO3fu1OOPP25fj4mJkSQNHDhQS5Ys0bhx43T16lUNGzZM58+fV7t27bRx40Z5eXk5q2UAAFDKODXMhIeHyzCMO2632WyKjY1VbGxsyTUFAAAspdQeMwMAAFAUhBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBphBkAAGBpLs5uAEDZU2/8FyVS50RCzxKpA6B0Y2YGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYGmEGAABYmouzGwB+q974L0yvcSKhp+k1AAAlg5kZAABgaYQZAABgaYQZAABgaYQZAABgaYQZAABgaYQZAABgaYQZAABgaYQZAABgaYQZAABgaYQZAABgaYQZAABgadybCXdVEvdJkrhXEgDg/lliZmbevHmqX7++3N3d1bZtW23dutXZLQEAgFKi1M/MrFixQtHR0Zo3b546duyo9957T927d9eBAwdUt25dZ7dX4rijNFAYM4jA71upn5mZOXOmXnrpJb388stq1qyZZs+erTp16mj+/PnObg0AAJQCpXpm5tq1a9q1a5fGjx9fYDwiIkIpKSm3fU5ubq5yc3Pt6xcvXpQkZWdnm9Jj0OQNpuz3Vv/3Vjf7n/Nzr5he79b3qiTqOaOmM18j72nx13TGewrAXDc/b4Zh3PvBRin2008/GZKMb775psD41KlTjcaNG9/2OZMnTzYksbCwsLCwsJSBJSMj4555oVTPzNxks9kKrBuGUWjspgkTJigmJsa+np+fr3Pnzql69ep3fE5Jyc7OVp06dZSRkaHKlSuXyZplvZ4zapb1es6oyWu0fj1n1Czr9ZxV804Mw1BOTo78/f3v+dhSHWZq1Kih8uXLKzMzs8B4VlaWfHx8bvscNzc3ubm5FRirUqWKWS3el8qVK5f4/yQlXbOs13NGzbJezxk1eY3Wr+eMmmW9nrNq3o63t3eRHleqDwB2dXVV27ZtlZSUVGA8KSlJoaGhTuoKAACUJqV6ZkaSYmJiNGDAAIWEhKhDhw5asGCBfvzxRw0dOtTZrQEAgFKg1IeZfv366ezZs5oyZYrOnDmjoKAgffnllwoICHB2aw5zc3PT5MmTC/0MVpZqlvV6zqhZ1us5oyav0fr1nFGzrNdzVs3iYDOMopzzBAAAUDqV6mNmAAAA7oUwAwAALI0wAwAALI0wAwAALI0wUwK2bNmiXr16yd/fXzabTatXrza1Xnx8vB555BF5eXmpZs2aevrpp3X48GFTa86fP1+tWrWyX2ipQ4cOWrdunak1bxUfHy+bzabo6GhT9h8bGyubzVZg8fX1NaXWrX766Sf9+c9/VvXq1VWxYkW1bt1au3btMqVWvXr1Cr1Gm82m4cOHm1Lvxo0b+q//+i/Vr19fHh4eatCggaZMmaL8/HxT6t2Uk5Oj6OhoBQQEyMPDQ6GhoUpNTS2Wfd/rs24YhmJjY+Xv7y8PDw+Fh4dr//79ptZcuXKlunXrpho1ashmsyktLc20etevX9cbb7yhli1bytPTU/7+/nrhhRd0+vRpU+pJv342mzZtKk9PT1WtWlVdunTR9u3b77teUWreasiQIbLZbJo9e7Zp9QYNGlToc9m+fXvT6knSwYMH1bt3b3l7e8vLy0vt27fXjz/+eN81zUaYKQGXL19WcHCwEhMTS6RecnKyhg8fru+++05JSUm6ceOGIiIidPnyZdNq1q5dWwkJCdq5c6d27typJ554Qn369HngL+qiSE1N1YIFC9SqVStT67Ro0UJnzpyxL/v27TO13vnz59WxY0dVqFBB69at04EDBzRjxgzTrmidmppa4PXdvFjln/70J1PqTZs2Te+++64SExN18OBBTZ8+Xf/zP/+jd955x5R6N7388stKSkrShx9+qH379ikiIkJdunTRTz/99MD7vtdnffr06Zo5c6YSExOVmpoqX19fde3aVTk5OabVvHz5sjp27KiEhIT7rlHUeleuXNHu3bs1adIk7d69WytXrtSRI0fUu3dvU+pJUuPGjZWYmKh9+/Zp27ZtqlevniIiIvSf//zHtJo3rV69Wtu3by/S5fYftN5TTz1V4PP55Zdfmlbvhx9+UKdOndS0aVNt3rxZ33//vSZNmiR3d/f7rmm6B70ZJBwjyVi1alWJ1szKyjIkGcnJySVat2rVqsb7779vao2cnBwjMDDQSEpKMsLCwoxRo0aZUmfy5MlGcHCwKfu+kzfeeMPo1KlTida81ahRo4yGDRsa+fn5puy/Z8+exuDBgwuMRUZGGn/+859NqWcYhnHlyhWjfPnyxtq1awuMBwcHGxMnTizWWr/9rOfn5xu+vr5GQkKCfeyXX34xvL29jXfffdeUmrdKT083JBl79uwpllr3qnfTjh07DEnGyZMnS6TexYsXDUnGV1999cD17lbz1KlTRq1atYz/+7//MwICAoxZs2aZVm/gwIFGnz59imX/RanXr18/Uz+HZmBm5nfg4sWLkqRq1aqVSL28vDwtX75cly9fVocOHUytNXz4cPXs2VNdunQxtY4kHT16VP7+/qpfv76ee+45HT9+3NR6a9asUUhIiP70pz+pZs2aatOmjRYu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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%time report_minimizing_tree(neg_entropy, inconsistent=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Jotto and Wordle Evaluation Summary\n",
    "\n",
    "Here is a summary of the reports on both games:\n",
    "\n",
    "|<br><br><br>Algorithm|JOTTO<br>Inonsistent<br><u>Prohibited</u><br>Mean (Max)|JOTTO<br>Inconsistent<br><u>Allowed</u><br>Mean (Max)|WORDLE<br>Inconsistent<br><u>Prohibited</u><br>Mean (Max)|WORDLE<br>Inconsistent<br><u>Allowed</u><br>Mean (Max)||\n",
    "|--|--|--|--|--|--|\n",
    "|minimize max        |6.31 (16)|6.38  (9)| 3.68 (8) | 3.64 (6) | \n",
    "|minimize expectation|6.11 (14)|6.13  (9)| 3.62 (8) | 3.55 (6) | \n",
    "|minimize neg_entropy|6.31 (15)|6.18  (9)| 3.60 (8) | 3.52 (6) |\n",
    "|random guesser      |6.59 (13)|         | 4.09 (9) |          |\n",
    "\n",
    "\n",
    "So for both games, the best approach is using the neg-entropy metric and allowing inconsistent guesses.\n",
    "\n",
    "One surprising thing: allowing inconsistent guesses in Jotto does *not* improve the mean score with eiither the max or expectation metric. However, it does uniformly improve the worst score.\n",
    "\n",
    "\n",
    "# Jotto Best and Worst First Guesses\n",
    "\n",
    "Here are the best and worst first guesses for Jotto:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>max_word</th>\n",
       "      <th>max_score</th>\n",
       "      <th>exp_word</th>\n",
       "      <th>exp_score</th>\n",
       "      <th>ent_word</th>\n",
       "      <th>ent_score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>DRAPE</td>\n",
       "      <td>497</td>\n",
       "      <td>SOUTH</td>\n",
       "      <td>400.50</td>\n",
       "      <td>STARE</td>\n",
       "      <td>-1.971</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>DREAM</td>\n",
       "      <td>497</td>\n",
       "      <td>DEBAR</td>\n",
       "      <td>401.43</td>\n",
       "      <td>CEDAR</td>\n",
       "      <td>-1.964</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>TRASH</td>\n",
       "      <td>497</td>\n",
       "      <td>CRAVE</td>\n",
       "      <td>401.94</td>\n",
       "      <td>DEBAR</td>\n",
       "      <td>-1.961</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>DEBAR</td>\n",
       "      <td>499</td>\n",
       "      <td>STARE</td>\n",
       "      <td>402.56</td>\n",
       "      <td>SPEAR</td>\n",
       "      <td>-1.958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>DECAL</td>\n",
       "      <td>499</td>\n",
       "      <td>CEDAR</td>\n",
       "      <td>402.94</td>\n",
       "      <td>REACH</td>\n",
       "      <td>-1.958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1386</th>\n",
       "      <td>QUAIL</td>\n",
       "      <td>740</td>\n",
       "      <td>AVOID</td>\n",
       "      <td>534.45</td>\n",
       "      <td>QUASI</td>\n",
       "      <td>-1.600</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1387</th>\n",
       "      <td>QUAKE</td>\n",
       "      <td>740</td>\n",
       "      <td>QUAKE</td>\n",
       "      <td>534.54</td>\n",
       "      <td>JUICY</td>\n",
       "      <td>-1.587</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1388</th>\n",
       "      <td>AVOID</td>\n",
       "      <td>745</td>\n",
       "      <td>QUASI</td>\n",
       "      <td>538.90</td>\n",
       "      <td>JUMPY</td>\n",
       "      <td>-1.564</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1389</th>\n",
       "      <td>AUDIO</td>\n",
       "      <td>761</td>\n",
       "      <td>AUDIO</td>\n",
       "      <td>595.22</td>\n",
       "      <td>AXIOM</td>\n",
       "      <td>-1.500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1390</th>\n",
       "      <td>AXIOM</td>\n",
       "      <td>827</td>\n",
       "      <td>AXIOM</td>\n",
       "      <td>599.56</td>\n",
       "      <td>AUDIO</td>\n",
       "      <td>-1.460</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1391 rows × 6 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     max_word  max_score exp_word  exp_score ent_word  ent_score\n",
       "0       DRAPE        497    SOUTH     400.50    STARE     -1.971\n",
       "1       DREAM        497    DEBAR     401.43    CEDAR     -1.964\n",
       "2       TRASH        497    CRAVE     401.94    DEBAR     -1.961\n",
       "3       DEBAR        499    STARE     402.56    SPEAR     -1.958\n",
       "4       DECAL        499    CEDAR     402.94    REACH     -1.958\n",
       "...       ...        ...      ...        ...      ...        ...\n",
       "1386    QUAIL        740    AVOID     534.45    QUASI     -1.600\n",
       "1387    QUAKE        740    QUAKE     534.54    JUICY     -1.587\n",
       "1388    AVOID        745    QUASI     538.90    JUMPY     -1.564\n",
       "1389    AUDIO        761    AUDIO     595.22    AXIOM     -1.500\n",
       "1390    AXIOM        827    AXIOM     599.56    AUDIO     -1.460\n",
       "\n",
       "[1391 rows x 6 columns]"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "first_guesses(wordlist)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "One difference is that in Jotto, most of the best guesses have two vowels, in Wordle three.\n",
    "\n",
    "`'OUIJA'` is not in our word list, but it was in another list, and it is uniquely bad as a Jotto guess, worse than `'AXIOM'` or `'AUDIO'`. \n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Next Steps\n",
    "\n",
    "There are many directions you could take this if you are interested:\n",
    "- **Other games:**\n",
    "  - Implement [Mastermind](https://en.wikipedia.org/wiki/Mastermind_%28board_game%29). The default version has 6 colors and 4 pegs. Can you go beyond that?\n",
    "  - Consider a Jotto game variant where each reply consists of two numbers: the number of letters in common with the target, and the number of letters that are in the exact correct position, as in Mastermind.\n",
    "  - Research what other computer scientists have done with [Jotto](https://arxiv.org/abs/1107.3342) or [Mastermind](http://serkangur.freeservers.com/).\n",
    "  - There are many variants of Wordle: Evil Wordle, Anti-Wordle, Quordle, Octordle, ...\n",
    "  - Refactor the code so it can more smoothly handle multiple different games.\n",
    "- **Better strategy**:\n",
    "  - Our `minimizing_tree` function is **greedy** in that it guesses the word that minimizes some metric of the current situation without looking ahead to future branches in the tree. Can you get better performance by doing some **look-ahead**? Perhaps with a beam search?\n",
    "  - As an alternative to look-ahead, can you improve a tree by editing it? Given a tree, look for interior nodes that end up with a worse-than-expected average score, and see if the node can be replaced with something better (covering the same target words). Correcting a few bad nodes might be faster than carefully searching for good nodes in the first place.\n",
    "  - The three metrics (max, expectation, and negative entropy) are all designed as proxies to what we really want to minimize: the average number of guesses. Can we estimate that directly? For example, we know a branch of size 1 will always take 1 guess; a branch of size 2 an average of 3/2 guesses; and a branch of size 3 an average of 5/3 guesses if one of the words partitions the other two, otherwise an average of 2. Can we learn a function that takes a set of words as input and estimates the average number of guesses for the set? Would a deep neural net be a good way to learn this function?\n",
    "  - Is it feasible to do a complete search and find the guaranteed optimal strategy? What optimizations to the code would be necessary? Is it worthwhile to port to a different language? How long would the search take?\n",
    "  - We assume that the list of taregt words is known to the guesser. The [New York Times WordleBot](https://www.nytimes.com/interactive/2022/upshot/wordle-bot.html) initally took this approach too, but then switched to a more nuanced approach where the guesser (the Bot) does not know for sure the list of target words, but instead assigns words a probability of being a target word that is correlated with the word's frequency in English usage. Can you develop a guesser that works along these lines?\n",
    "- **Chooser strategy**:\n",
    "  - Analyze the game where the chooser is not random, but rather is an adversary to the guesser–the chooser tries to choose a word that will maximize the guesser's score. What's a good strategy for the chooser? Is there a strategy equilibrium?\n",
    "  - Refactor `play` to accomodate three roles:\n",
    "    - A chooser, who decides what the target word is.\n",
    "    - A guesser, who guesses the target word.\n",
    "    - A replier, who says what the reply to the guess is."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.15"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
